基准时间限制:1 秒 空间限制:131072 KB 分值: 0
难度:基础题
给出两个字符串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<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1010;
char A[maxn];
char B[maxn];
int dp[maxn][maxn];
int main()
{
scanf("%s %s",A,B);
int len1 = strlen(A);
int len2 = strlen(B);
memset(dp,0,sizeof(dp));
for(int i = 1; i <= len1; i++)
for(int j = 1; j <= len2; j++)
{
if(A[i-1] == B[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
int i = len1, j = len2, ans = 0;
char s[maxn];
while(dp[i][j])
{
if(dp[i][j] == dp[i-1][j]) i--;
else if(dp[i][j] == dp[i][j-1]) j--;
else{
s[ans] = A[i-1];
i--,j--;
ans++;
}
}
for(int l = ans-1; l >= 0; l--)
printf("%c",s[l]);
printf("\n");
return 0;
}