两个字符串比如:s1 = "abcd";s2 = "becd"; 那么公共子串最长是3;
定义:dp[i+1][j+1] 表示s1[0]s[i]和s2[0]s2[j]的公共子串长度。
思路:分成两种大方向 1.s1[i] == s2[j] 那么是dp[i+1][j+1] = dp[i][j] + 1;
2.max(dp[i+1][j],dp[i][j+1]);
最好是利用二维数组想一下过程,尤其是二重循环。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define Max 10000
char s1[Max],s2[Max];
int dp[Max][Max];
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(scanf("%s%s",s1,s2) != EOF){
n = strlen(s1);
m = strlen(s2);
for(int i = 0;i < n; i++){
for(int j = 0;j < m; j++){
if(s1[i] == s2[j]){
dp[i+1][j+1] = dp[i][j] + 1;
}
else {
dp[i+1][j+1] = max(dp[i+1][j],dp[i][j+1]);
}
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}

1447

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



