给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input
abcicba
abdkscab
Sample Output
abca
思路:
状态转移方程:
咋说呢,我也蒙……(菜哭……)
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int flag[maxn][maxn];
char a[maxn],b[maxn];
int main()
{
memset(flag,0,sizeof(flag));
memset(dp,0,sizeof(dp));
gets(a);
gets(b);
int lena,lenb;
lena=strlen(a);
lenb=strlen(b);
for(int i=1; i<=lena; i++)
{
for(int j=1; j<=lenb; j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
flag[i][j]=1;
}
else
{
if(dp[i][j-1]>dp[i-1][j])
{
dp[i][j]=dp[i][j-1];
flag[i][j]=2;
}
else
{
dp[i][j]=dp[i-1][j];
flag[i][j]=3;
}
}
}
}
int i=lena;
int j=lenb;
int t=0;
char prin[1005];
while(i>0&&j>0)
{
if(flag[i][j]==1)
{
prin[t]=a[i-1];
t++;
i--;
j--;
}
else if(flag[i][j]==2)
{
j--;
}
else
{
i--;
}
for(int k=t-1;k>=0;k--)
printf("%c",prin[k]);
printf("\n");
return 0;
}