styxmx 发表于 2017-7-10 20:54:19

[华为]查找两个字符串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==s2)         
{               
dp=dp+1;               
if(dp>maxLen)               
{                  
maxLen=dp;                  
start=i-maxLen;//记录最长公共子串的起始位置               
                }            
}      
}   
cout<<s1.substr(start,maxLen)<<endl;
}

int main()
{   
string s1,s2;   
while(cin>>s1>>s2)   
{      
findMaxCommonStr(s1,s2);
}   
return 0;
}
页: [1]
查看完整版本: [华为]查找两个字符串a,b中的最长公共子