[华为]查找两个字符串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=,start=;    
vector<vector<int> >dp(len1+,vector<int>(len2+,));    
for(int i=;i<=len1;++i)        
for(int j=;j<=len2;++j)        
{            
if(s1[i-]==s2[j-])           
{                
dp[i][j]=dp[i-][j-]+;                
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 ;
}
上一篇:AJAX 的简单用法:


下一篇:数据挖掘方面重要会议的最佳paper集合