题目描述:
给出两个字符串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
题目分析:
LCS最长公共子序列。
动态规划的入门题目。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1001][1001];
char X[1001];
char Y[1001];
int i, j;
int main()
{
cin.getline(X,1001);
cin.getline(Y,1001);
int xlen = strlen(X);
int ylen = strlen(Y);
for(i = 1; i <= xlen; ++i)
{
for(j = 1; j <= ylen; ++j)
{
if(X[i-1] == Y[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else if(dp[i][j-1] > dp[i-1][j])
{
dp[i][j] = dp[i][j-1];
}
else
{
dp[i][j] = dp[i-1][j];
}
}
}
i = xlen;
j = ylen;
int k = dp[i][j];
char lcs[1001] = {'\0'};
while(i && j)
{
if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1)
{
lcs[--k] = X[i-1];
i--;
j--;
}
else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1]) i--;
else j--;
}
printf("%s\n",lcs);
}