#include <iostream>
#include <memory.h>
using namespace std;
const int MAX = 1000;
int dp[MAX][MAX];
int main()
{
char str1[MAX], str2[MAX], LCS[MAX];
int i, j, len1, len2;
while (1){
cin.getline(str1, MAX);
cin.getline(str2, MAX);
len1 = strlen(str1);
len2 = strlen(str2);
memset(dp, 0, sizeof(dp));
for (i = 1; i <= len1; i++){
for (j = 1; j <= len2; j++){
if (str1[i-1] == str2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}
else if (dp[i-1][j] > dp[i][j-1]){
dp[i][j] = dp[i-1][j];
}
else {
dp[i][j] = dp[i][j-1];
}
}
}
printf("The Length of LCS is: %d\n", dp[len1][len2]);
//for (i = 0; i <= len1; i++){
// for (j = 0; j <= len2; j++)
// printf("%d ", dp[i][j]);
// printf("\n");
//}
//输出LCS 本来是逆序打印的,可以写一递归函数完成正序打印
//这里采用的方法是将Y作为临时存储LCS的数组,最后输出Y
i = len1, j = len2;
int k = dp[i][j];
LCS[k] = '\0';
while (i && j){
if (dp[i][j] == dp[i-1][j-1] + 1){
LCS[--k] = str1[i-1];
--i;
--j;
}
else if (dp[i-1][j] >= dp[i][j-1]){
--i;
}
else{
--j;
}
}
printf("%s\n", LCS);
}
system("pause");
}
#include <iostream>
using namespace std;
const int MAX = 1000;
int dp[2][MAX];//滚动数组储存LCS的长度
int main()
{
char str1[MAX], str2[MAX];
int xlen, ylen, i, j, k;
while (1){
cin.getline(str1, MAX);
cin.getline(str2, MAX);
xlen = strlen(str1);
ylen = strlen(str2);
for (i = 1; i <= xlen; ++i){
k = i & 1;//i与1的与运算
for (j = 1; j <= ylen; ++j){
if (str1[i-1] == str2[j-1]){
dp[k][j] = dp[k^1][j-1] + 1;//k^1为异或运算
}
else if (dp[k][j-1] > dp[k^1][j]){
dp[k][j] = dp[k][j-1];
}
else{
dp[k][j] = dp[k^1][j];
}
}
}
printf("The len of LCS is: %d\n", dp[k][ylen]);
}
system("pause");
}
/*
ABDESKTDJ
BDKSEGC
*/
最长公共子序列(LCS)的两种求解方法
最新推荐文章于 2022-11-15 14:20:36 发布