最长公共子序列

来源:互联网 发布:神马seo搜索排名优化 编辑:程序博客网 时间:2024/06/06 23:51
                                                               最长公共子序列
问题描述:给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是X和Y的公共子序列。
例如,若X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A}则序列{B,C,A}是X和Y的一个公共子序列,但它不是X和Y的最长公共子序列。{B,C,B,A}是X和Y的公共子序列,长度为4,因为X和Y没有长度大于4的公共子序列。
所以X和Y的最长公共子序列为:{B,C,B,A}
#include<iostream>using namespace std;#define N 10void LCSLength(int m, int n, char *x, char *y, int c[][10], int b[][10]){int i, j;for (i = 1; i <= m; i++) c[i][0] = 0;for (i = 1; i <= n; i++) c[0][i] = 0;for (i = 1; i <= m;i++)for (j = 1; j <= n; j++){if (x[i] == y[j]){c[i][j] = c[i - 1][j - 1] + 1;b[i][j] = 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;}}}void LCS(int i,int j, char *x, int b[][10]){if (i == 0 || j == 0) return;if (b[i][j] == 1){LCS(i - 1, j - 1, x, b); cout << x[i];}else if (b[i][j] == 2)LCS(i - 1, j, x, b);else LCS(i, j - 1, x, b);}int main(){char x[N], y[N];int i=0;int c[10][10], d[10][10];int m, n;cout << "输入第一个字符:" << endl;cin >> x;m = strlen(x);for (int i = m; i >=0; i--)x[i ] = x[i-1];cout << "输入第二个字符:" << endl;cin >> y;n = strlen(y);for (int i = n; i >=0; i--)y[i] = y[i-1];LCSLength(m,n,x,y,c,d);cout << c[m][n] << endl;LCS(m,n,x,d);cout << endl;system("pause");return 0;}
//运行结果:

原创粉丝点击