1 // 最长公共子串问题
2 // dp解决
3 // 状态转移方程: dp = 0 当str1[i-1] != str2[j-1], dp = dp[i-1][j-1] 当str1[i-1] == str2[j-1]
4
5 #include <bits/stdc++.h>
6 using namespace std;
7
8 int longest_sub_string(char str1[], int len_str1, char str2[], int len_Str2)
9 {
10 int dp[len_str1 + 1][len_Str2 + 1];
11 int res = 0;
12 for (int i = 0; i <= len_str1; i++) // 初始化dp数组第一列
13 dp[i][0] = 0;
14 for (int i = 1; i <= len_Str2; i++) // 初始化dp数组第一行
15 dp[0][i] = 0;
16 for (int i = 1; i <= len_str1; i++)
17 for (int j = 1; j <= len_Str2; j++)
18 if (str1[i-1] == str2[j-1])
19 {
20 dp[i][j] = dp[i - 1][j - 1] + 1;
21 res = max(res, dp[i][j]); //每次更新记录最大值
22 }
23 else //不相等的情况
24 dp[i][j] = 0;
25 return res;
26 }
27
28 int main()
29 {
30 // 输入12345 67345,输出3(345相同)
31 char str1[100], str2[100];
32 scanf("%s%s", str1, str2);
33 int lon = longest_sub_string(str1, strlen(str1), str2, strlen(str2));
34 printf("%d", lon);
35 return 0;
36 }