普通网友 2021-11-11 20:33 采纳率: 42.9%
浏览 109
已结题

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

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

本题含有多组输入数据!
数据范围:字符串长度,
进阶:时间复杂度:,空间复杂度:

img

  • 写回答

1条回答 默认 最新

  • 从善若水 5G/6G通信领域优质创作者 2021-11-11 20:34
    关注
    
    //思路:动态规划经典问题,加一个start标记即可,注意将较短子串最先出现的那个输出
    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    void findMaxCommonStr(string s1,string s2)
    {
        if(s1.length()>s2.length())
                swap(s1,s2);//s1用于保存较短的子串
        int len1=s1.length(),len2=s2.length();
        int maxLen=0,start=0;
        vector<vector<int> >dp(len1+1,vector<int>(len2+1,0));
        for(int i=1;i<=len1;++i)
            for(int j=1;j<=len2;++j)
            {
                if(s1[i-1]==s2[j-1])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    if(dp[i][j]>maxLen)
                    {
                        maxLen=dp[i][j];
                        start=i-maxLen;//记录最长公共子串的起始位置
                    }
                }
            }
       cout<<s1.substr(start,maxLen)<<endl;
    }
    int main()
    {
       string s1,s2;
       while(cin>>s1>>s2)
       {
           findMaxCommonStr(s1,s2);
       }
       return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 创建了问题 11月11日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来