c++实现:
http://mp.blog.csdn.net/mdeditor/index/79029684
#include<iostream>
using namespace std;
char X[8] = {'0','A','B','C','B','D','A','B'};//序列X,0号下标不用
char Y[7] = {'0','B','D','C','A','B','A'};//序列Y,0号下标不用
int m = sizeof(X)/sizeof(char)-1;//X长度
int n = sizeof(Y)/sizeof(char)-1;//Y长度
void LCS_length(int **c, int **b, char *X, char *Y)//计算X和Y的一个LCS长度,结果存放在c和b
{
for(int i = 1; i <= m; i++)
c[i][0] = 0;
for(int j = 0; j <= n; j++)
c[0][j] = 0;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
{
if(X[i] == Y[j])//情况1
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;//表示左上箭头
}
else if(c[i-1][j] >= c[i][j-1])//情况2
{
c[i][j] = c[i-1][j];
b[i][j] = 2;//表示向上箭头
}
else//情况3
{
c[i][j] = c[i][j-1];
b[i][j] = 3;//表示向左箭头
}
}
}
void print_LCS(int **b, char *X, int i, int j)//打印一个LCS
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 1)
{
print_LCS(b, X, i-1, j-1);//向左上
cout<<X[i];//后序输出
}
else if(b[i][j] == 2)
print_LCS(b, X, i-1, j);//向左
else //即b[i][j] == 3
print_LCS(b, X, i, j-1);//向上
}
int** matrixInit(int row,int col)//创建行为[0...row-1],列为[0...col-1]的二维数组,并赋初值0
{
int **matrix;//指针的指针(二重指针)
matrix = (int**)malloc(sizeof(int*)*row);//分配row个int指针的内存空间,首地址为matrix
for(int i = 0 ; i < row; i++)//对row个指针中的每个
matrix[i] = (int*)malloc(sizeof(int)*col);//分配col个int的内存空间
for(int j = 0; j < row; j++)
for(int k = 0; k < col; k++)
matrix[j][k] = 0;//所有元素赋初值0
return matrix;
}
int main()
{
int **c;//存放LCS长度
int **b;//存放LCS的解
c = matrixInit(m+1,n+1);//创建二维数组
b = matrixInit(m+1,n+1);
LCS_length(c,b,X,Y);//计算X和Y的一个LCS长度
print_LCS(b,X,m,n);//打印一个LCS
return 0;
}
输出:
BCBA