飞鸟各投林

导航

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

链接:https://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506
来源:牛客网

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

输入描述:
输入两个字符串


输出描述:
返回重复出现的字符

 

输入例子:
abcdefghijklmnop
abcsafjklmnopqrstuvw

 

输出例子:
jklmnop
//思路:动态规划经典问题,加一个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;
}

posted on 2017-04-05 16:06  飞鸟各投林  阅读(406)  评论(0编辑  收藏  举报