#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int LCS(const string &s1,const string &s2)
{
string str1=s1;
string str2=s2;
int len1=str1.length();
int len2=str2.length();
//忽略大小写
transform(str1.begin(),str1.end(),str1.begin(),::toupper);
// cout<<str1<<endl;
transform(str2.begin(),str2.end(),str2.begin(),::toupper);
// cout<<str2<<endl;
vector<vector<int> > veca(len1+1);
int i,j;
int max=0;
for(i=0;i<=len1;i++)
{
veca[i].resize(len2+1,0);
}
for(i=0;i<=len2;i++)
{
veca[0][i]=0;
}
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[j-1])
{
veca[i][j]=veca[i-1][j-1]+1;
if(veca[i][j]>max)
{
max=veca[i][j];
}
}
else
veca[i][j]=0;
}
}
return max;
}
string getLCS(string str1, string str2) {
vector<vector<int> > record(str1.length(), vector<int>(str2.length()));
int maxLen = 0, maxEnd = 0;
for(int i=0; i<static_cast<int>(str1.length()); ++i)
for (int j = 0; j < static_cast<int>(str2.length()); ++j) {
if (str1[i] == str2[j]) {
if (i == 0 || j == 0) {
record[i][j] = 1;
}
else {
record[i][j] = record[i - 1][j - 1] + 1;
}
}
else {
record[i][j] = 0;
}
if (record[i][j] > maxLen) {
maxLen = record[i][j];
maxEnd = i; //若记录i,则最后获取LCS时是取str1的子串
}
}
return str1.substr(maxEnd - maxLen + 1, maxLen);
}
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
//cout<<LCS(str1,str2)<<endl;
cout<<getLCS(str1,str2)<<endl;
}
return 0;
}
最长公共子串内容
最新推荐文章于 2021-07-06 22:28:35 发布