最长公共子序列
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <string>
#define MAX_SIZE 9
using namespace std;
int lcs_len(char a[], char b[], int c[][MAX_SIZE])
{
int m = strlen(a);
int n = strlen(b);
printf("%d-%d\n", m, n);
for (int i = 0; i < m; i++) {
c[i][0] = 0;
}
for (int i = 0; i <= n; i++) {
c[0][i] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (a[i - 1] == b[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];
}
}
}
printf("%d\n", c[m][n]);
return c[m][n];
}
char * build_lcs(char s[], char* a, char* b, int c[][MAX_SIZE])
{
int m = strlen(a);
int n = strlen(b);
int k = lcs_len(a,b,c);
s[k] = '/0';
while( k > 0 ) {
if (c[m][n] == c[m - 1][n]) {
m--;
} else if (c[m][n] == c[m][n - 1]) {
n--;
} else {
k--;
s[k] = a[m-1];
m--;
n--;
}
}
printf("%s\n", s);
return s;
}
int main()
{
char a[MAX_SIZE] = "ABCBDAB";
char b[MAX_SIZE] = "BCDB";
char z[MAX_SIZE];
int c[MAX_SIZE][MAX_SIZE] = {0};
build_lcs(z, a, b, c);
return 0;
}