LCS



#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"); }
原文地址:https://www.cnblogs.com/tianjintou/p/4523298.html