
#include <iostream>
using namespace std;
#include <string>
void lcs(int **A,const string &x,const string &y)
{
int m=x.size();
int n=y.size();
if(m<=0||n<=0)
return;
for(int i=0;i<=n;i++) //A[m+1][n+1] 都是从0到m和0到n
A[0][i]=0;
for(int i=1;i<=m;i++)
A[i][0]=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(x[i-1]==y[j-1]) //注意,因为字符串是从0到m-1和0到n-1
A[i][j]=A[i-1][j-1]+1;
else
A[i][j]=max(A[i-1][j],A[i][j-1]);
}
}
void print(int **A,int m,int n,const string &x,const string &y)
{
if(m==0||n==0)
return;
if(x[m-1]==y[n-1]) //必须用递归,不然是倒序的,从A[m][n]开始向前
{
print(A,m-1,n-1,x,y);
cout<<x[m-1]<<endl;
}
else if(A[m-1][n]>=A[m][n-1])
print(A,m-1,n,x,y);
else
print(A,m,n-1,x,y);
}
int main()
{
string x="abcdefglasfsd";
string y="abegsdfa";
int m=x.size();
int n=y.size();
int **A=new int*[m+1];
for(int i=0;i<=m;i++)
A[i]=new int[n+1];
lcs(A,x,y);
print(A,m,n,x,y);
for(int i=0;i<=m;i++)
free(A[i]);
free(A);
system("PAUSE");
}