重点说明:采用动态规划的方法可以降低时间复杂度。本题与“最大公共子序列问题LCS”有一点不同,公共子串必须是连续的。 递推公式如下: 当s1[i-1] = s2[j-1]时,dp[i][j] = dp[i-1][j-1] + 1; 当s1[i-1] != s2[j-1]时,dp[i][j] = 0; 式中,i=1,2..,len1 j=1,2,..len2 记录dp[i][j]中最大的值,就是公共子串的长度。
#include<stdio.h>
#include<string.h>
#define MAX(a,b) (a>b?a:b)
int get_len(int s1_start, int s2_start);
char s1[150] = {0};
char s2[150] = {0};
int dp[151][151] = {0};
int main() {
int max_len, count;
int len1, len2;
while (scanf("%s %s", s1, s2) != EOF) {
max_len = 0;
for (int i = 1; i <= strlen(s1); i++) {
for (int j = 1; j <= strlen(s2); j++) {
if(s1[i-1] == s2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}
else{
dp[i][j] = 0;
}
max_len = MAX(max_len,dp[i][j]);
}
}
printf("%d\n",max_len);
}
return 0;
}