#include <stdio.h>
#define LEFTUP 110
#define UP 111
#define LEFT 112
#define MAX_WIDTH 512
#define MAX_HEIGHT 512
char arr_c[MAX_WIDTH][MAX_WIDTH];
char arr_b[MAX_WIDTH][MAX_WIDTH];
void lcs(char* arr_x, int i, int j)
{
if(i==0 || j==0)
return;
if(arr_b[i][j]==LEFTUP)
{
lcs(arr_x, i-1, j-1);
printf("%c ", arr_x[i]);
}
else
{
if(arr_b[i][j]==UP)
lcs(arr_x, i-1, j);
else
lcs(arr_x, i, j-1);
}
}
int lcs_lenth(char* arr_x, char* arr_y, int xLen, int yLen)
{
int m = xLen;
int n = yLen;
int i, j;
for(i=1; i<=m; i++)
arr_c[i][0] = 0;
for(j=1; j<=n; j++)
arr_c[0][j] = 0;
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
if(arr_x[i]==arr_y[j])
{
arr_c[i][j] = arr_c[i-1][j-1]+1;
arr_b[i][j] = LEFTUP;
}
else
{
if(arr_c[i-1][j] >= arr_c[i][j-1])
{
arr_c[i][j] = arr_c[i-1][j];
arr_b[i][j] = UP;
}
else
{
arr_c[i][j] = arr_c[i][j-1];
arr_b[i][j] = LEFT;
}
}
}
}
printf("c = %d\n", arr_c[m][n]);
lcs(arr_x, m, n);
printf("\n");
return 0;
}
int main()
{
char x[8] = {0, 'A', 'B', 'C', 'B', 'D', 'A', 'B'};
char y[7] = {0, 'B', 'D', 'C', 'A', 'B', 'A'};
lcs_lenth(x, y, 7, 6);
return 0;
}
output:
c = 4
B C B A