题意:求最长公共子串的长度。
——>>题意简单,设d[i][j]表示前i个a和前j个b的最长公共子串的长度,
当a[i] == b[j]时,d[i][j] = d[i-1][j-1];
否则d[i][j] = max(d[i-1][j], d[i][j-1]);
不过有小陷阱:测试数据中有空格字符存在,用scanf("%s", &)就WA!!!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 10;
int d[maxn][maxn];
int main()
{
char a[maxn], b[maxn];
while(gets(a+1) && gets(b+1)) //测试数据中有空格字符,用scanf("%s", &)WA!!!
{
int len_a = strlen(a+1), len_b = strlen(b+1), i, j;
memset(d, 0, sizeof(d));
for(i = 1; i <= len_a; i++)
for(j = 1; j <= len_b; j++)
if(a[i] == b[j]) d[i][j] = d[i-1][j-1] + 1;
else d[i][j] = max(d[i-1][j], d[i][j-1]);
printf("%d\n", d[len_a][len_b]);
}
return 0;
}
另外发现,若令len_a = strlen(a), len_b = strlen(b);下面的跳出条件为<len_a,<len_b,最后输出d[len_a-1][len_b-1]时,会WA!!!
本文介绍了解决UVA 1346问题的方法,使用动态规划算法寻找两个字符串的最长公共子串。文章特别强调了处理输入时避免空白字符导致错误的重要性。
1101

被折叠的 条评论
为什么被折叠?



