#include<iostream>
#include<string>
#include<vector>
using namespace std;
void print(vector<vector<int> > &vecb,string str1,int i,int j)
{
if(i==0||j==0)
{
return;
}
if(vecb[i][j]==1)
{
print(vecb,str1,i-1,j-1);
cout<<str1[i-1]<<" ";
}
else if(vecb[i][j]==2)
{
print(vecb,str1,i-1,j);
}
else
print(vecb,str1,i,j-1);
}
int LCSXL(const string &str1,const string &str2)
{
if(str1==""||str2=="")
return 0;
vector<vector<int> > veca(str1.length() + 1, vector<int>(str2.length() + 1));
vector<vector<int> > vecb(str1.length() + 1, vector<int>(str2.length() + 1));
int maxend=0;
int max=0;
int i,j;
for (i = 0; i <= str1.length(); i++) {
veca[i][0] = 0;
}
for (j = 0; j <= str2.length(); j++) {
veca[0][j] = 0;
}
for (i = 1; i <= str1.length(); i++) {
for (j = 1; j <= str2.length(); j++) {
if (str1[i - 1] == str2[j - 1]) {
veca[i][j] = veca[i - 1][j - 1] + 1;
vecb[i][j]=1;
}
else {
if (veca[i - 1][j] >= veca[i][j - 1])
{
veca[i][j] = veca[i - 1][j];
vecb[i][j]=2;
}
else
{
veca[i][j] = veca[i][j-1];
vecb[i][j]=3;
}
}
}
}
string s1=str1;
print(vecb,str1,s1.length(),str2.length());
return veca[i-1][j-1];
}
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
cout<<LCSXL(str1,str2)<<endl;
}
return 0;
}
最长公共子序列(二维数组解决)
最新推荐文章于 2022-03-15 20:28:08 发布