具体分析见算法导论,直接上代码了。
#include <iostream>
using namespace std;
int LCS_Length(string X, string Y, int** C, int XLen, int YLen)
{
int m = XLen, n = YLen;
for (int i = 1; i <= m; i++)
C[i][0] = 0;
for (int i = 1; i <= n; i++)
C[0][i] = 0;
C[0][0] = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (X[i-1] == Y[j-1])
{
C[i][j] = C[i-1][j-1]+1;
}
else
{
if (C[i-1][j] >= C[i][j-1])
C[i][j] = C[i-1][j];
else
C[i][j] = C[i][j-1];
}
}
}
/*
for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
cout<<C[i][j]<<" ";
}
cout<<endl;
}*/
//调试bug,打印输出,将X[i]==Y[j]改成X[i-1][j-1]。
return C[m][n];
}
void print_LCS(int** C, int i, int j, string X)
{
if (i == 0 || j == 0)
return;
if (C[i][j] == C[i-1][j])
{
print_LCS(C, i-1, j, X);
}
else if (C[i][j] == C[i][j-1])
{
print_LCS(C, i, j-1, X);
}
else
{
print_LCS(C, i-1, j-1, X);
cout<<X[i-1];
}
}
int main()
{
string X = "ABCBDAB";
string Y = "BDCABA";
int XLen = X.length();
int YLen = Y.length();
int **C;
C = new int *[XLen+1];
for (int i = 0; i <= XLen; i++)
{
C[i] = new int[YLen+1];
}
cout<<LCS_Length(X,Y,C,XLen,YLen)<<endl;
print_LCS(C, XLen, YLen, X);
for (int i = 0; i <= XLen; i++)
{
delete[]C[i];
}
delete[]C;
}