[华为]查找两个字符串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; }
厚积薄发,行胜于言@飞鸟各投林