首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用C++找到最长公共子串

对于这个问题,可以使用C++中的动态规划算法来找到最长公共子串。以下是一个基本的实现步骤:

  1. 定义一个二维数组dp,其中dpi表示字符串s的第i到第j个字符之间的子串是否是另一个字符串t的第i到第j个字符之间的子串的最长公共子串。
  2. 初始化dp数组,使得dp0和dp0(j>0)都等于true,表示空字符串是另一个字符串的最长公共子串。
  3. 从左到右,从上到下遍历字符串s和t,对于s的第i个字符和t的第j个字符,如果它们相等,则dpi等于dpi-1和dpi-1中的较大值,否则dpi等于false。
  4. dps.length()等于true,表示整个字符串s和t本身就是最长公共子串。
  5. 最后,对于所有dpi为true的子串,从i=0到i=j,取出最长的一个,就是最长公共子串。

以下是一个简单的C++代码实现:

代码语言:c++
复制
#include <iostream>
#include <string>
using namespace std;

bool isCommonSubstr(string s, string t) {
    int m = s.length(), n = t.length();
    bool dp[m+1][n+1];
    memset(dp, false, sizeof(dp));
    dp[0][0] = true;
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0 && j == 0) {
                continue;
            }
            if (s[i-1] == t[j-1]) {
                dp[i][j] = dp[i-1][j-1] || dp[i-1][j];
            } else {
                dp[i][j] = false;
            }
        }
    }
    return dp[m][n];
}

int main() {
    string s = "abcde";
    string t = "bcdef";
    if (isCommonSubstr(s, t)) {
        cout << "最长公共子串是: " << s.substr(0, t.length()) << endl;
    } else {
        cout << "没有找到公共子串" << endl;
    }
    return 0;
}

以上代码中,我们使用了一个bool类型的二维数组dp来记录字符串s和t的每个子串是否是另一个字符串的最长公共子串。在主函数中,我们输入两个字符串s和t,然后调用isCommonSubstr函数来检查它们是否是公共子串,如果是,则输出最长公共子串,否则输出提示信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券