基准时间限制: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示例
//AC代码 #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int dp[1005][1005];//dp[i][j] 表示s1串前i个和s2串前j个字符的最大值 int max(int a,int b,int c)//之前没有对三个数求最大值进行重载导致一直错误 { if(a>=b&&a>=c) return a; else if(b>=a&&b>=c) return b; else return c; } int main() { char s1[1005]; char s2[1005]; scanf("%s %s",s1+1,s2+1); memset(dp,0,sizeof(dp)); char ch[1005]; int i,j; for(i=1;s1[i];i++) for(j=1;s2[j];j++) { dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+(s1[i]==s2[j]? 1 : 0));//状态转移方程 } i--; j--; int imax=dp[i][j]; int k=imax; while(i>0&&j>0) { if(s1[i]==s2[j]) { ch[imax--]=s1[i]; i--; j--; } else { if(dp[i][j-1]>dp[i-1][j])//寻找原来的轨迹 { j--; } else{ i--; } } } for(int i=1;i<=k;i++) { printf("%c",ch[i]); } printf("\n"); return 0; }