//.........................h
int LongestSubString (char A[], char B[], char C[], int n, int m);
void PrintDouble (int **s, int m, int n);
//.............................cpp
int LongestSubString (char A[], char B[], char C[], int n, int m)
{
//为两个二维数组申请空间
int **L = new int* [n + 1];
int **S = new int*[n + 1];
for (int i = 0; i < n + 1; i++)
{
L[i] = new int[m + 1];
S[i] = new int[m + 1];
}
//初始化空间
for (int i = 0; i < n + 1; i++)
{
L[0][i] = 0;
L[i][0] = 0;
S[0][i] = 0;
S[i][0] = 0;
}
//计算长度及状态字
for (int i = 1; i < n + 1; i++)
{
for (int j = 1; j < m + 1; j++)
{
if (A[i] == B[j])
{
L[i][j] = L[i - 1][j - 1] + 1;
S[i][j] = 1;
}
else if (L[i - 1][j] >= L[i][j - 1])
{
L[i][j] = L[i - 1][j];
S[i][j] = 2;
}
else
{
L[i][j] = L[i][j - 1];
S[i][j] = 3;
}
}
}
//打印s
PrintDouble(S, n + 1, m + 1);
cout << endl;
//搜索最长公共子序列字符
int i = n , j = m, k = L[i][j];
int len = L[i][j];
while ((i != 0) && (j != 0))
{
switch (S[i][j])
{
case 1:
C[k] = A[k];
k--;
j--;
case 2:
i--;
break;
case 3:
j--;
break;
}
}
C[0] = ' ';
//打印L
PrintDouble(L, n + 1, m + 1);
cout << endl;
//释放空间
for (i = 0; i < n + 1; i++)
{
delete [] S[i];
delete [] L[i];
}
return len;
}
void PrintDouble (int **s, int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << s[i][j] << " ";
cout << endl;
}
}
//....................测试
/**
* 测试最长公共子序列问题
*/
int main ()
{
char x[] = " xyxzyxyzzy";
char y[] = " xzyzxyzxyzxy";
char z[20];
memset (z, 0, sizeof (z));
int len;
len = LongestSubString(x, y, z, strlen (x), strlen (y));
cout << len << endl;
cout << "子序列是:" << z << endl;
return 0;