1、算法
// L[m][n],S[m][n]定义为全局变量
//算法c++描述——最长公共子序列问题
int CommonOrder(int m, int n, int x[ ], int y[ ], int z[ ])
{
for (j=0; j<=n; j++) //初始化第0行
L[0][j]=0;
for (i=0; j<=m; i++) //初始化第0列
L[i][0]=0;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
if (x[i]= =y[j]) { L[i][j]=L[i-1][j-1]+1; S[i][j]=1; }
else if (L[i][j-1]>=L[i-1][j]) { L[i][j]=L[i][j-1]; S[i][j]=2; }
else {L[i][j]=L[i-1][j]; S[i][j]=3; }
i=m; j=n; k=L[m][n];
for (i>0 && j>0)
{
if (S[i][j]= =1) { z[k]=x[i]; k--; i--; j--; }
else if (S[i][j]= =2) j--;
else i--;
}
return L[m][n];
}
2、求两串字符串的最长公共子序列的长度,并输出相应字符。
#include<iostream>
#include<cstring>
#define N 100
//c[i][j]记录序列Xi和Yj的最长公共子序列长度
//p[i][j]记录方向,便于打印最优解。
int c[N][N],p[N][N];
using namespace std;
void lcslength(int m,int n,char *x,char *y)
{
int i,j;
for(i=0;i<=m;i++)
c[i][0]=0;
for(i=0;i<=m;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;
p[i][j]=1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
p[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
p[i][j]=3;
}
}
cout<<c[m][n]<<endl;
}
void lcsprint(int i,int j,char *x)
{
if(i==0||j==0)
return ;
if(p[i][j]==1)
{
lcsprint(i-1,j-1,x);
cout<<x[i]<<" ";
}
else if(p[i][j]==2)
{
lcsprint(i-1,j,x);
}
else
lcsprint(i,j-1,x);
}
int main()
{
char a[N],b[N];
while(cin>>a>>b)
{
int l1=strlen(a);
int l2=strlen(b);
char c[N],d[N];
for(int i=1;i<=l1;i++)
{
c[i]=a[i-1];
d[i]=b[i-1];
}
lcslength(l1,l2,c,d);
lcsprint(l1,l2,c);
}
return 0;
}
/*
abccd aecd
*/