给出两个字符串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 <iostream> using namespace std; string A,B; char K[1005]; int DPS[1005][1005],biao[1005][1005]; int main() { ios::sync_with_stdio(false); cin>>A>>B; int len1=A.size(),len2=B.size(); for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { if(A[i-1]==B[j-1]) { DPS[i][j]=DPS[i-1][j-1]+1; biao[i][j]=1; } else if(DPS[i-1][j]>DPS[i][j-1]) { DPS[i][j]=DPS[i-1][j]; biao[i][j]=2; } else if(DPS[i-1][j]<=DPS[i][j-1]) { DPS[i][j]=DPS[i][j-1]; biao[i][j]=3; } } int x=DPS[len1][len2],n=len1,m=len2; while(x>=1) { if(biao[n][m]==1) { K[x]=A[n-1]; n--; m--; x--; } else if(biao[n][m]==2) { n--; } else if(biao[n][m]==3) { m--; } } for(int i=1;i<=DPS[len1][len2];i++) { cout<<K[i]; } return 0; }