#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void LCS_LEN(int m,int n,char X[],char Y[],int c[8][7],int b[8][7])
{
int i , j;
for(i = 0; i <= m; i++)
c[i][0] = 0;
for(i = 0; 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] = 0; //0表示从i-1,j-1过来。
}else
{
if(c[i-1][j] >= c[i][j-1]) //Xi != Yi X[i-1]Y[j]
{
c[i][j] = c[i-1][j];
b[i][j] = 1; //1表示从i-1,j来。
}else
{
c[i][j] = c[i][j-1];
b[i][j] = 2; //2代表由i,j-1而来。
}
}
}
}
}
void PRINT_LCS(char X[],int b[][7],int i,int j)
{
if(i == 0 || j == 0)
{
return;
}else if(b[i][j] == 0)
{
PRINT_LCS(X,b,i-1,j-1);
printf("%c ",X[i]);
}else if(b[i][j] == 1)
PRINT_LCS(X,b,i-1,j);
else
PRINT_LCS(X,b,i,j-1);
}
int main()
{
char X[8] = {' ','A','B','C','B','D','A','B'};
char Y[7] = {' ','B','D','C','A','B','A'};
int c[8][7];
int b[8][7];
LCS_LEN(sizeof(X)/sizeof(char)-1,sizeof(Y)/sizeof(char)-1,X,Y,c,b);
PRINT_LCS(X,b,7,6);
return 0;
}
void LCS_LEN();函数的运行时间为O(mn);因为每个表项的计算时间为O(1).
print()函数的运行时间为O(m+n);因为在递归过程中,i或者j至少一个要减小直到为0;