实现第五版,王晓东编著的第三章3.3最长公共子序列问题的代码。课本54页。
#include<iostream>
#include<string>
using namespace std;
void LCSLength(int m,int n,char *x,char *y,int **c,int **b);
void LCS(int i,int j,char *x,int **b);
int main(){
int m,n;
cout<<"请分别输入两个序列的个数:";
cin>>m>>n;
char *x=new char[m];
char *y=new char[n];
for(int i=1;i<=m;i++) cin>>x[i];
for(int i=1;i<=n;i++) cin>>y[i];
int **c=new int*[m+1];
int **b=new int*[m+1];
for(int i=0;i<m+1;i++) c[i]=new int [n+1];
for(int i=0;i<m+1;i++) b[i]=new int [n+1];
LCSLength(m,n,x,y,c,b);
LCS(m,n,x,b);
return 0;
}
void LCSLength(int m,int n,char *x,char *y,int **c,int **b){
int i,j;
for(i=1;i<=m;i++){
c[i][0]=0;
}
for(i=1;i<=n;i++){
c[0][i]=0;
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(x[i]==y[j]){
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else if(c[i-1][j]>=c[i][j-1]){
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
}
void LCS(int i,int j,char *x,int **b){
if(i==0||j==0){
return;
}
if(b[i][j]==1){
LCS(i-1,j-1,x,b);
cout<<x[i];
}
else if(b[i][j]==2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}