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

查找两个字符串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日

悬赏问题

  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式