1006 最长公共子序列Lcs
原创
©著作权归作者所有:来自51CTO博客作者不想悲伤到天明的原创作品,请联系作者获取转载授权,否则将追究法律责任
1006 最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
收起
输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入样例
abcicba
abdkscab
输出样例
abca
#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std ;
typedef long long LL;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const LL maxn = 1e18+999 ;
const int MAX = 55005 ;
int n ;
string a , b ;
int DP[1005][1005] ;
char p[MAX] ;
int cnt ;
int main () {
cin >> a >>b ;
int lena = a.size() ;
int lenb = b.size() ;
for(int i = 1; i <= lena; i++)
for(int j = 1; j <= lenb; j++){
if(a[i-1] == b[j-1] ){
DP[i][j] = max(DP[i][j], DP[i - 1][j - 1] + 1);
}
else {
DP[i][j] = max(DP[i][j - 1], DP[i - 1][j]);
}
}
int len = DP[lena][lenb] ;
p[len] = '\0' ;
int i = lena , j = lenb ;
while(DP[i][j]) {
if(DP[i][j] == DP[i-1][j]) i-- ;
else if (DP[i][j] == DP[i][j-1]) j-- ;
else {
p[--len] = a[i-1] ;
i-- ;
j-- ;
}
}
cout<<p ;
return 0 ;
}