题目描述
最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2
asdf
adfsd
123abc
abc123abc
样例输出
3
6
解题思路:
序列s1和序列s2
长度分别为l1和l2;
创建1个二维数组dp[m.n];
初始化dp数组内容为0
i和j分别从1开始,i++,i++循环:
如果s1[m] == s2[n],则dp[m,n] = dp[m - 1, n -1] + 1;
如果s1[m] != s2[n],则dp[m,n] = max{dp[m,n - 1],dp[m - 1, n]}
最后从dp[l1,l2]中的数字一定是最大的,且这个数字就是最长公共子序列的长度
从数组L中找出一个最长的公共子序列
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
#define max(a, b) a > b? a : b
int dp[1001][1001];
int main()
{
int n;
cin >> n;
while(n--){
char str1[1002], str2[1002];
cin >> str1 >> str2;
int len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
for(int i = 1; i <= len1; i++)
for(int j = 1; j <= len2; j++)
dp[i][j] = 0;
for(int i = 1; i <= len1; i++)
for(int j = 1; j <= len2; j++){
if(str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}
cout << dp[len1][len2] << endl;}
return 0;
}
http://acm.pdsu.edu.cn/problem.php?cid=1018&pid=15