代码部分:
#include<iostream>
using namespace std;
char X[100];//存放X序列的数组
char Y[100];//存放Y序列
int c[100][100];//存放公共子序列个数的二维表
int b[100][100];//存放标志位,用来后面找最优解的二维表
int lcs_length(int m, int n)
{
for (int i = 1; i <= m; i++) c[i][0] = 0;//当某一个序列为0时也要赋值0
for (int j = 1; j <= m; j++) c[0][j] = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (X[i] == Y[j])
{
c[i][j] = c[i - 1][j - 1] + 1; b[i][j] = 1;//序列相等的时候,将左上方的数值+1赋值给此位置,代表相等的序列个数又多了一个,此外b数组记录下来,用1代替符号↖
}
else
if (c[i - 1][j] >= c[i][j - 1])
{
c[i][j] = c[i - 1][j]; b[i][j] = 2;//如果此位置上面的数字比这个位置左边的数字大,就把上面的值赋给这个位置,此外用↑来记录数值的来源
}
else
{
c[i][j] = c[i][j - 1]; b[i][j] = 3;//如果此位置上面的数字比这个位置左边的数小,就把左边的值赋给这个位置,此外用←记录数值的来源
}
}
}
return c[m][n];//左下角这个位置记录了这两个序列最长相等序列的长度
}
void lcs(int i, int j, char X[100])
{
if ((i == 0) || (j == 0))
return;//递归出口
if (b[i][j] == 1)
{
lcs(i - 1, j - 1, X);
cout << X[i];//如果这个位置有相等序列,则这个位置的数值来源肯定是用↖标记的,输出此位置的序列值
}
else
if (b[i][j] == 2)
lcs(i - 1, j, X);
else
lcs(i, j - 1, X);
}
int main()
{
int m;
int n;
cout << "请输入X序列的个数: ";
cin >> m;
cout << "请输入Y序列的个数: ";
cin >> n;
cout << "请输入X序列:";
for (int i = 1; i <= m; i++)
{
cin >> X[i];
}
cout << "请输入Y序列:";
for (int j = 1; j <= n; j++)
{
cin >> Y[j];
}
lcs_length(m, n);
int L = lcs_length(m, n);
for (int i = 0; i <= m; i++) //输出c数组
{
for (int j = 0; j <= n; j++)
{
cout << c[i][j] << ' ';
}
cout << endl;
}
cout << "最长公共子序列的长度为: " << L << endl;
cout << "最长公共子序列为:";
lcs(m, n, X);
cout << endl;
return 0;
}
结果演示: