查找两个字符串a,b中的最长公共子串

查找两个字符串a,b中的最长公共子串

http://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506

这道题考的是常见的最长公共子串问题,这类问题需要用动态规划解决。

dp[i][j] 表示字符串a[1...i]和字符串b[1...j]的最大公共字串长度。

递推公式:
如果a[i] == a[j], 那么dp[i][j] = dp[i-1][j-1] + 1; 否则 dp[i][j] = 0;

题解

#include <iostream>
using namespace std;

int lcs(string a, string b)
{
    if(a.size() > b.size()) {
        string tmp = a;
        a = b;
        b = tmp;
    }
    a.insert(0, 1, ' ');
    b.insert(0, 1, ' ');
    int n = a.size(), m = b.size();
    int dp[n][m];
    int maxLen = 0, last;
    for(int i = 0; i < n; i++) dp[i][0] = 0;
    for(int j = 0; j < m; j++) dp[0][j] = 0;
    for(int i = 1; i < n; i++) 
    {
        for(int j = 1; j < m; j++)
        {
            if(a[i] == b[j]) {
                dp[i][j] = dp[i-1][j-1] + 1;
                if(maxLen < dp[i][j]) {
                    maxLen = dp[i][j];
                    last = i;
                }
            } else {
                dp[i][j] = 0;
            } 
        }
    }
    cout << a.substr(last-maxLen+1, maxLen) << endl;
    return maxLen;
}

int main()
{
    string a, b;
    while(cin >> a >> b)
    {
        lcs(a, b);
    }
    return 0;
}

https://github.com/ultraji/nowcoder

全部评论
dp[i][j]应该表示以a[i]和b[j]结尾的公共子串的最大长度吧?
4 回复 分享
发布于 2021-05-18 20:28
递推公式是不是有点问题,如果a[i]与b[j]不相等,怎么可能直接为0啊,只是末尾不相同,前面是可能有相同的子串啊
3 回复 分享
发布于 2021-01-08 18:29
dp定义中须强调最长公共子串包含a[i]和b[j]
1 回复 分享
发布于 2021-04-18 16:55
为啥先得插入一个空格呢?
点赞 回复 分享
发布于 2020-11-01 12:05
int dp[n][m]在本地VS编译报错,提示表达式必须包含常量值,没明白为什么线上线下编译结果不一致
点赞 回复 分享
发布于 2021-04-02 16:42
动态规划原来是这么用的666
点赞 回复 分享
发布于 2021-04-26 20:58
开头为什么要交换字符串呀?
点赞 回复 分享
发布于 2021-09-02 21:44

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
4 4 评论
分享
牛客网
牛客企业服务