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
解题思路:
在输出的时候要从最后向前遍历,如果符合条件那么压栈.
AC代码:
#include<stdio.h>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];
int main()
{
string a;
string b;
cin >> a >> b;
int len_a = a.size();
int len_b = b.size();
for(int i = 1;i <= len_a;i++)
{
for(int j = 1;j <= len_b;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 len = dp[len_a][len_b];
string ans;
while(dp[len_a][len_b])
{
if(dp[len_a][len_b] == dp[len_a-1][len_b]) len_a--;
else if(dp[len_a][len_b] == dp[len_a][len_b-1]) len_b--;
else ans.push_back(a[len_a-1]),len_a--,len_b--;
}
for(int i = len-1;i >= 0;i--) printf("%c",ans[i]);
return 0;
}