算法提高 最长公共子序列
时间限制:1.0s 内存限制:256.0MB
问题描述
给定两个字符串,寻找这两个字串之间的最长公共子序列。
输入格式
输入两行,分别包含一个字符串,仅含有小写字母。
输出格式
最长公共子序列的长度。
扫描二维码关注公众号,回复:
9134574 查看本文章
样例输入
abcdgh
aedfhb
样例输出
3
样例说明
最长公共子序列为a,d,h。
数据规模和约定
字串长度1~1000。
分析:设两个字符串分别为和。设为子串和的最长公共子序列的长度,其递推关系式为
初始条件:。
#include <stdio.h>
#include <string.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
char a[1005] = { 0 }, b[1005] = { 0 };
int len_a, len_b;
int f[1005][1005] = { 0 };
scanf("%s", a + 1);
scanf("%s", b + 1);
len_a = (int)strlen(a + 1);
len_b = (int)strlen(b + 1);
for (int i = 1; i <= len_a; ++i)
{
for (int j = 1; j <= len_b; ++j)
{
if (a[i] == b[j])
f[i][j] = f[i-1][j-1] + 1;
else
f[i][j] = max(f[i-1][j], f[i][j-1]);
}
}
printf("%d", f[len_a][len_b]);
return 0;
}