查找两个字符串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
开头为什么要交换字符串呀?
点赞 回复 分享
发布于 2021-09-02 21:44
动态规划原来是这么用的666
点赞 回复 分享
发布于 2021-04-26 20:58
int dp[n][m]在本地VS编译报错,提示表达式必须包含常量值,没明白为什么线上线下编译结果不一致
点赞 回复 分享
发布于 2021-04-02 16:42
为啥先得插入一个空格呢?
点赞 回复 分享
发布于 2020-11-01 12:05

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
10-22 19:44
门头沟学院 Java
面了100年面试不知...:那我得去剪个头
点赞 评论 收藏
分享
评论
4
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务