#include <iostream>
using namespace std;
int c[100][100];
int b[100][100];//标示最长子序列
void LCS_length(char *X,char *Y,int X_len,int Y_len)
{
int i,j;
for (i=0;i<=X_len;i++)
{
c[i][0]=0;
}
for (j=0;j<=Y_len;j++)
{
c[0][j]=0;
}
for (i=1;i<=X_len;i++)
{
for (j=1;j<=Y_len;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 Print_LCS(char *X,int X_len,int Y_len)
{
if (X_len==0||Y_len==0)
{
return;
}
if (b[X_len][Y_len]==1)
{
Print_LCS(X,X_len-1,Y_len-1);
cout<<X[X_len];
}
else if (b[X_len][Y_len]==2)
{
Print_LCS(X,X_len-1,Y_len);
}
else
{
Print_LCS(X,X_len,Y_len-1);
}
}
int main()
{
char *X,*Y;
X=" abcbdab";//前面留着一个空字符为了串从1开始。
Y=" bdcaba";
int X_len=strlen(X)-1;
int Y_len=strlen(Y)-1;
LCS_length(X,Y,X_len,Y_len);
cout<<"最长公共子序列长度为:"<<c[X_len][Y_len]<<endl;
cout<<"输出最长公共子序列:";
Print_LCS(X,X_len,Y_len);
cout<<endl;
}
算法导论书中简单实现。其中书中对最长序列标记方法挺值得借鉴。