首页 > 代码库 > 1006 最长公共子序列Lcs
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示例
abcicbaabdkscab
Output示例
abca
1 /* 2 记录一下dp是怎么走的 3 最后再dfs走回去 4 */ 5 #include <ctype.h> 6 #include <cstdio> 7 #include <cstring> 8 9 const int MAXN=1010;10 11 char s1[MAXN],s2[MAXN];12 13 int f[MAXN][MAXN],pre[MAXN][MAXN];14 15 inline void read(int&x) {16 register char c=getchar();17 for(x=0;!isdigit(c);c=getchar());18 for(;isdigit(c);x=x*10+c-48,c=getchar());19 }20 21 inline int max(int x,int y) {22 return x<y?y:x;23 }24 25 void dfs(int len1,int len2) {26 if(len1==0||len2==0) return;27 if(pre[len1][len2]==1) {28 dfs(len1-1,len2-1);29 printf("%c",s1[len1]);30 }31 else if(pre[len1][len2]==2) dfs(len1-1,len2);32 else dfs(len1,len2-1);33 }34 35 int main() {36 scanf("%s%s",s1+1,s2+1);37 int l1=strlen(s1+1),l2=strlen(s2+1);38 for(int i=1;i<=l1;++i)39 for(int j=1;j<=l2;++j) {40 if(s1[i]==s2[j]) {41 f[i][j]=f[i-1][j-1]+1;42 pre[i][j]=1;43 }44 else if(f[i-1][j]>f[i][j-1]){45 f[i][j]=f[i-1][j];46 pre[i][j]=2;47 }48 else {49 f[i][j]=f[i][j-1];50 pre[i][j]=3;51 }52 }53 dfs(l1,l2);54 return 0;55 }
1006 最长公共子序列Lcs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。