/**********************************/
/* 最长公共子序列 */
/*求A、B两字符序列的最长公共子序列*/
/**********************************/
#include<iostream>
#define N 50 //最大A字符序列长度
#define M 50 //最大B字符序列长度
using namespace std;
int main(){
/*函数声明*/
int lcs(char A[], char B[], char C[], int L[][M+1], int S[][M+1], int n, int m);
void create_xulie(char T[], int t);
void show_xulie(char T[], int t);
void show(int L[][M + 1], int S[][M + 1], int n, int m);
char A[N + 1], B[M + 1], C[M + 1]; //序列A、B及其公共子序列C
int L[N + 1][M + 1]; //搜索过程中的子序列长度
int S[N + 1][M + 1]; //搜索过程中的子序列状态
int n, m;
cout << "请输入A、B字符序列的长度(不超过50)为:";
cin >> n>>m;
cout << "请输入A字符序列:";
create_xulie(A, n);
cout << "请输入B字符序列:";
create_xulie(B, m);
cout << "\nA、B字符序列为:\n";
show_xulie(A, n);
show_xulie(B, m);
int len = lcs(A, B, C, L,S,n, m);
cout << "\n最长公共子序列的长度为:" << len;
cout << "\n最长公共子序列为:";
show_xulie(C, len);
show(L,S,n, m); /*打印L、S*/
system("pause");
return 0;
}
/*创建字符序列*/
void create_xulie(char T[], int t){
for (int i = 1; i <= t; i++)
cin >> T[i];
}
/*输出字符序列*/
void show_xulie(char T[], int t){
for (int i = 1; i <= t; i++)
cout << T[i];
cout << endl;
}
/*求最长公共子序列算法*/
/*返回:最长公共子序列及其长度*/
int lcs(char A[], char B[], char C[],int L[][M+1],int S[][M+1], int n, int m){
int i, j, k;
for (i = 0; i <= n; i++){ //初始化第0列
L[i][0] = 0; S[i][0] = 0;
}
for (j = 0; j <= m; j++){ //初始化第0行
L[0][j] = 0; S[0][j] = 0;
}
/*计算长度及状态字*/
for (i = 1; i <= n; i++){
for (j = 1; j <= m; 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;
}
}
}
i = n, j = m, k = L[i][j]; //最长公共子序列长度
/*搜索最长公共子序列字符*/
while ((i != 0) && (j != 0)){
switch (S[i][j]){
case 1:C[k] = A[i]; k--; i--; j--; break;
case 2:i--; break;
case 3:j--; break;
}
}
return L[n][m];
}
/*打印L、S*/
void show(int L[][M + 1], int S[][M + 1], int n, int m){
cout << "\n子序列长度:\n";
for (int i = 0; i <= n; i++){
for (int j = 0; j <= m; j++){
cout << L[i][j] << " ";
}
cout << endl;
}
cout<<"\n子序列状态:\n";
for (int i = 0; i <= n; i++){
for (int j = 0; j <= m; j++){
cout << S[i][j] << " ";
}
cout << endl;
}
cout << endl << endl;
}
最长公共子序列问题
最新推荐文章于 2024-04-14 15:33:18 发布