题解 | #公共子串计算#

公共子串计算

http://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

题意:
        给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。

方法一:
动态规划

思路:
          
                 
    

      


#include <bits/stdc++.h>

using namespace std;
int dp[155][155];

int main(){
    string a,b;
    cin >> a >> b;
    int n1=a.size(),n2=b.size();
    int res=0;
    for(int i=1;i<=n1;i++){//二重循环
        for(int j=1;j<=n2;j++){
            if(a[i-1]==b[j-1])//如果相等,则+1
                dp[i][j]=dp[i-1][j-1]+1;
            else//否则,变为0
                dp[i][j]=0;
            res=max(res,dp[i][j]);//维护最大值
        }
    }
    cout << res << endl;
    return 0;
}

时间复杂度:
空间复杂度:

方法二:
暴力

思路:
        二重循环枚举字符串a和字符串b的每个字符作为起点。
        从起点出发向后循环,寻找最长的公共子串,res维护最大值。
         最后,输出最大值。

#include <bits/stdc++.h>

using namespace std;

int main(){
    string a,b;
    cin >> a >> b;
    int n1=a.size(),n2=b.size();
    int res=0;
    for(int i=0;i<n1;i++){//三重循环
        for(int j=0;j<n2;j++){
            int k=i,l=j;//二重循环遍历字符串a和字符串b的起点
            while(k<n1&&l<n2&&a[k]==b[l]){//从起点出发遍历
                k++;
                l++;
            }
            res=max(res,k-i);//维护最大值
        }
    }
    cout << res << endl;
    return 0;
}

时间复杂度:
空间复杂度:



全部评论

相关推荐

盖茨伯爵:一样兄弟,我从4月开始发到现在了,都三四百个了
无实习如何秋招上岸
点赞 评论 收藏
分享
LazyBreeze:项目尽量体现你对技术的理解和深度,不是说把中间件用一下就完事了,你项目里面提到集群和分布式,你真在服务器上部署过吗,感觉太假了,第二个项目说自己用了微服务的什么组件,只是用了没有自己的思考,很难让面试官注意到你的简历。针对某几个技术点自己多思考一下,考虑一下有没有别的替代方案,可以写一下,即使没有真的实现
点赞 评论 收藏
分享
投递拓竹科技等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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