AI 日报

【字符串处理算法】获取最长公共子串的算法设计及C代码实现

  • By admin
  • Oct 18, 2023 - 2 min read



算法设计:最长公共子串

最长公共子串问题是一个经典的字符串处理问题,旨在找出给定两个字符串中的最长公共子串。其中,子串是指从原字符串中连续删除一些字符,而子序列是指从原字符串中删除一些字符,但不必连续。

解决最长公共子串问题的一种常见方法是使用动态规划算法。动态规划主要解决具有重叠子问题和最优子结构性质的问题,通过将问题分解为子问题,并存储子问题的解来避免重复计算,从而提高算法的效率。

动态规划算法实现

#include 
#include 
#include 

using namespace std;

string longestCommonSubstring(string str1, string str2) {
    int m = str1.length();
    int n = str2.length();
    vector> dp(m + 1, vector(n + 1, 0));
    int maxLen = 0;
    int endIndex = 0;

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                if (dp[i][j] > maxLen) {
                    maxLen = dp[i][j];
                    endIndex = i - 1;
                }
            }
        }
    }

    return str1.substr(endIndex - maxLen + 1, maxLen);
}

int main() {
    string str1 = "abcdefg";
    string str2 = "abdefg";
    string result = longestCommonSubstring(str1, str2);
    cout << "最长公共子串为:" << result << endl;

    return 0;
}

算法解释与分析

上述代码中的动态规划算法使用了一个二维数组dp来存储最长公共子串的长度。dp[i][j]表示以str1[i-1]和str2[j-1]结尾的最长公共子串的长度。

对于每个str1[i-1]和str2[j-1],如果相等,则最长公共子串的长度可以通过在str1[i-1]和str2[j-1]前的最长公共子串长度dp[i-1][j-1]基础上加1得到。如果不相等,则最长公共子串的长度为0。

在计算最长公共子串的过程中,同时记录最长公共子串的长度maxLen和索引endIndex。最后通过substr函数从str1中截取最长公共子串并返回。

总结

最长公共子串算法是一种常用的字符串处理算法,通过动态规划的思想,可以高效地找到给定两个字符串中的最长公共子串。该算法的时间复杂度为O(m*n),其中m和n分别为两个字符串的长度。在实际应用中,最长公共子串问题常常被用于文本相似性匹配、DNA序列分析等领域。