#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 求数组 a 与 b 的最长公共子序列
*
*/
#define LEFT_UP 0x1
#define LEFT 0x2
#define UP 0x4
int get_long_common_subsequence(char *a, int al, char*b, int bl, int ***c)
{
int i = 0;
int j = 0;
int row = al > bl ? al:bl;
int clm = al < bl ? al:bl;
int **cl = (int**)malloc((row+1)*sizeof(int*));
*c = cl;
#if 1
for(i = 0; i < row+1; i++)
{
cl[i] = (int*)malloc((clm+1)*sizeof(int));
for(j = 0; j < clm+1; j++)
{
cl[i][j] = 0;
}
}
#endif
/*
* c[i,j] save the 'longest-common-subsequence' length a[i] and b[j]
*
* |0 if i = 0 or j = 0;
* |
* c[i,j] = |c[i-1,j-1]+1 if i,j > 0 and a[i] == b[j]
* |
* |max(c[i,j-1], c[i-1,j]) if i,j > 0 and a[i] != b[j]
*/
for(i = 0; i < row; i++)
{
for(j = 0; j < clm; j++)
{
if(a[i] == b[j])
{
cl[i+1][j+1] = cl[i][j] + 1;
}
else if(cl[i+1][j] >= cl[i][j+1])
{
cl[i+1][j+1] = cl[i+1][j];
}
else
{
cl[i+1][j+1] = cl[i][j+1];
}
}
}
printf("\n");
return 0;
}
void print_lcs(int **c, int m, int n, char *a)
{
if(m == 0 || n == 0)
return ;
if(c[m][n]-1 == c[m-1][n-1])
{
print_lcs(c, m-1, n-1, a);
printf("%c,", a[m-1]);
}
/*else if(c[m-1][n-1] == c[m][n])
{
print_lcs(c, m-1, n-1, a);
}*/
else if(c[m-1][n] == c[m][n])
{
print_lcs(c, m-1, n, a);
}
else
{
print_lcs(c, m, n-1, a);
}
}
int main(int argc, char* argv[])
{
char a[] = "abcbdab";
char b[] = "bdcaba";
int **c = NULL;
int m = 7, n = 6;
get_long_common_subsequence(a, m, b, n, &c);
print_lcs(c, m, n, a);
printf("\n");
int i = 0, j = 0;
#if 0
for(i = 0; i < m+1; i++)
{
for(j = 0; j < n+1; j++)
{
printf("c[%d][%d] = %d\n", i, j, c[i][j]);
}
}
#endif
return 0;
}
最大公共字串
最新推荐文章于 2021-10-31 18:42:54 发布