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

查找两个字符串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 修改中兴光猫sn的时候提示失败
  • ¥15 java大作业爬取网页
  • ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
  • ¥15 有没有办法利用libusb读取usb设备数据
  • ¥15 为什么openeluer里面按不了python3呢?
  • ¥15 关于#matlab#的问题:训练序列与输入层维度不一样
  • ¥15 关于Ubuntu20.04.3LTS遇到的问题:在安装完CUDA驱动后,电脑会进入卡死的情况,但可以通过键盘按键进入安全重启,但重启完又会进入该情况!
  • ¥15 关于#嵌入式硬件#的问题:树莓派第一天重装配置python和opencv后第二天打开就成这样,瞎捣鼓搞出来文件夹还是没把原来的界面调回来
  • ¥20 Arduino 循迹小车程序电路出错故障求解
  • ¥20 Arduino 循迹小车程序电路出错故障求解