#include<iostream>
#include<stdio.h>
#include<iomanip>
using namespace std;
const int length = 100;
void LCSLength(int m, int n, char* x, char* y, int** c, int** b)
{
int i, j;
for (i = 0; i <= m; i++)
{
c+[0] = 0;
b+[0] = 0;
}
for (i = 0; i <= n; i++)
{
c[0]+ = 0;
b[0]+ = 0;
}
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
{
if (x+ == y[j])
{
c+[j] = c[i - 1][j - 1] + 1;
b+[j] = 1;
}
else if (c[i - 1][j] >= c+[j - 1])
{
c+[j] = c[i - 1][j];
b+[j] = 2;
}
else
{
c+[j] = c+[j - 1];
b+[j] = 3;
}
}
}
void LCS(int i, int j, char* x, int** b)
{
if (i == 0 || j == 0)
return;
if (b+[j] == 1)
{
LCS(i - 1, j - 1, x, b);
cout << x+;
}
else if (b+[j] == 2)
{
LCS(i - 1, j, x, b);
}
else
{
LCS(i, j - 1, x, b);
}
}
void LCSLENGTH(int m, int n, int** b, string** d)
{
int i, j;
for (i = 0; i <= m; i++)
{
for (j = 0; j <= n; j++)
{
if (b+[j] == 1)
{
d+[j] = "\\";
}
else if (b+[j] == 2)
d+[j] = "l";
else if (b+[j] == 3)
d+[j] = "—";
}
}
cout << "方向矩阵:" << endl;
for (i = 0; i <= m; i++)
{
for (j = 0; j <= n; j++)
{
cout << setw(10) << d+[j];
}
cout << endl;
}
}
void DisplayLCSLengt(int m, int n, char* x, int** c, int** b)
{
int i, j;
for (i = 0; i <= m; i++)
{
for (j = 0; j <= n; j++)
{
cout << setw(10) << c+[j];
}
cout << endl;
}
cout << endl;
cout << "最长公共子序列为:";
LCS(m, n, x, b);
cout << endl;
}
int main()
{
char x[length], y[length];
int i, j, m, n;
cout << "请输入序列A的长度";
cin >> m;
cout << "请输入序列A:";
for (i = 0; i < m; i++)
cin >> x+;
cout << "请输入序列B的长度";
cin >> n;
cout << "请输入序列B:";
for (i = 0; i < n; i++)
cin >> y+;
int** c = new int* [length];
int** b = new int* [length];
string** d = new string * [length];
for (i = 0; i < length; i++)
{
c+ = new int[length];
b+ = new int[length];
d+ = new string[length];
}
LCSLength(m, n, x, y, c, b);
DisplayLCSLengt(m, n, x, c, b);
LCSLENGTH(m, n, b, d);
system("pause");
return 0;
}
求最长公共子序列
于 2022-05-07 15:04:25 首次发布