Description
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
abca
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = ;
int dp[N][N];
char s1[N], s2[N], s[N]; void getLCA(int i,int j,int k)
{
if (k<) return;
if (s1[i]==s2[j])
{
s[k] = s2[j]; //or s[k]=s1[i].
getLCA(i-,j-,k-);
return;
}
if (dp[i - ][j] >= dp[i][j - ]) getLCA(i-,j,k);
else getLCA(i, j - , k);
} int main()
{
while (scanf("%s", s1) != EOF)
{
scanf("%s", s2);
int len_s1 = strlen(s1);
int len_s2 = strlen(s2);
memset(dp,,sizeof(dp));
for (int i = ; i < len_s1; i++)
{
for (int j = ; j < len_s2; j++)
{
if (i == || j == ) {
dp[i][j] = (s1[i] == s2[j]);
if (i) dp[i][j] = max(dp[i][j], dp[i - ][j]);
if (j) dp[i][j] = max(dp[i][j], dp[i][j - ]);
continue;
}
dp[i][j] = max(dp[i][j-], dp[i - ][j]);
dp[i][j] = max(dp[i][j],dp[i-][j-]+(s1[i]==s2[j]));
}
}
int len = dp[len_s1 - ][len_s2 - ];
s[len] = '\0';
getLCA(len_s1-,len_s2-,len-);
puts(s);
}
}