基准时间限制: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> using namespace std; const int maxn=1009; char a[maxn],b[maxn]; int path[maxn][maxn],dp[maxn][maxn];//path 记录路径 void lcs(int i,int j)//打印路径 { if(i==0||j==0) return ;//结束标志,a或者b只要有一个找完了,就不在找了 if(path[i][j]==1)//path是1的时候输出这个字符 { lcs(i-1,j-1);//因为是从后往前找的 printf("%c",a[i-1]);//所以这句得写到递归函数下边 } else if(path[i][j]==2) lcs(i-1,j); else lcs(i,j-1); return ; } int main() { while(~scanf("%s %s",a,b)) { memset(dp,0,sizeof(dp)); int m=strlen(a); int n=strlen(b); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; path[i][j]=1; } else if(dp[i-1][j]>dp[i][j-1]) { dp[i][j]=dp[i-1][j]; path[i][j]=2; } else { dp[i][j]=dp[i][j-1]; path[i][j]=3; } lcs(m,n); printf("\n"); // printf("\n%d\n",dp[m][n]);//输出最长子序列的长度 } return 0; }
扫描二维码关注公众号,回复:
914355 查看本文章