1006 最长公共子序列Lcs
基准时间限制: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
之前做过这类型的题目,以为很简单,随便一改就可以了。
写的过程中,发现自己还是too young ,很多信息、很多细节都没注意,最开始用dfs搜索LCS,很快写完但是样例总是有问题,改方法,还是一样的问题。最后发现是细节上边边界的问题。如果这是比赛,这道题就会让自己满头大汗的吧。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1005;
char ans[maxn];
char s1[maxn],s2[maxn];
int dp[maxn][maxn],pos;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%s%s",s1+1,s2+1);
int len1 = strlen(s1+1);
int len2 = strlen(s2+1);
int i,j;
for(i = 1;s1[i]; i++) {
for(j = 1;s2[j]; j++) {
if(s1[i] == s2[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
else {
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
}
}
}
i--,j--;
pos = 0;
while(len1 > 0 && len2 > 0) {
if(s1[len1] == s2[len2]) {
ans[pos++] = s1[len1];
len1--,len2--;
}
else {
if(dp[len1-1][len2] > dp[len1][len2-1]) {
len1--;
}
else {
len2--;
}
}
}
for(int i = pos-1;i >= 0; i--) {
printf("%c",ans[i]);
}
printf("\n");
return 0;
}