待續:待研究,比較最長子序列和最長子串,研究後綴數組和後綴樹
LCS實現代碼:
#include <iostream>
using namespace std;
int c[8][7],b[8][7];
void lcs_length(char *X,char *Y)
{
int m = strlen(X);
int n = strlen(Y);
for ( int i = 0; 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++)
{
int s_i = i - 1;
int s_j = j - 1;
if (X[s_i] == Y[s_j])
{
c[i][j] = c[i-1][j-1]+1;
b[i][j] = 2;
}
else
{
if (c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 3;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = 1;
}
}
}
}
void print_lcs(char *X,int i,int j)
{
if (i == 0 || j == 0)return;
if (b[i][j] == 2)
{
print_lcs(X,i-1,j-1);
int s_i = i - 1;
cout<<X[s_i];
//cout<<"*";
}
else if(b[i][j] == 1) print_lcs(X,i-1,j);
else print_lcs(X,i,j-1);
}
int main()
{
char *s1 = "ABCBDAB";
char *s2 = "BDCABA";
lcs_length(s1,s2);
print_lcs(s1,7,6);
system("pause");
return 0;
}