基准时间限制: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 <iostream>
#include <stdio.h>
#include <string.h>
#define siz 1005
using namespace std;
char s1[siz],s2[siz];
int p[siz][siz];
char s[siz];
int maxx(int a,int b)
{
return b>a?b:a;
}
void getp(int len1,int len2)
{
memset(p,0,sizeof(p));
int i;
for(i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i]==s2[j])
{
p[i][j]=p[i-1][j-1]+1;
}
else
{
p[i][j]=maxx(p[i-1][j],p[i][j-1]);
}
}
}
}
int getss(int len1,int len2)
{
int k=0;
int i=len1;
int j=len2;
while(i>0&&j>0)
{
if(s1[i]==s2[j])
{
s[k++]=s1[i];
// cout<<k<<endl;
i--;
j--;
}
else if(p[i-1][j]>p[i][j-1])
{
i--;
}
else
{
j--;
}
}
return k;
}
int main()
{
scanf("%s %s",s1+1,s2+1);
int len1=strlen(s1+1);
int len2=strlen(s2+1);
getp(len1,len2);
int k=getss(len1,len2);
for(--k; k>=0; k--)
{
printf("%c",s[k]);
}
cout<<endl;
return 0;
}