基准时间限制: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
首先直接dp求出最长长度,在计算的过程中标记一下子序列的下标,然后回溯过去即可
#include<iostream> #include<algorithm> #include<string.h> using namespace std; #define MAXN 1005 char a[MAXN],b[MAXN]; int dp[MAXN][MAXN]; int d[MAXN][MAXN]; void dfs(int l1,int l2) { if(l1==0||l2==0) { return ; } if(d[l1][l2]==0) { dfs(l1-1,l2-1); cout<<a[l1-1]; } else if(d[l1][l2]==1) { dfs(l1,l2-1); } else { dfs(l1-1,l2); } } int main() { memset(dp,0,sizeof(dp)); memset(d,0,sizeof(d)); cin>>a>>b; int l1=strlen(a); int l2=strlen(b); for(int i=1;i<=l1;i++) { for(int j=1;j<=l2;j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; d[i][j]=0; } else if(dp[i][j-1]>=dp[i-1][j]) { dp[i][j]=dp[i][j-1]; d[i][j]=1; } else { dp[i][j]=dp[i-1][j]; d[i][j]=-1; } } } dfs(l1,l2); cout<<endl; return 0; }