题解 | #查找两个字符串a,b中的最长公共子串#
查找两个字符串a,b中的最长公共子串
https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506
//学习了大佬的解法,自己也理解了一下,稍微理解了一点动态规划
//最重要的是设置状态,设置dp[i][j]为以str1[i - 1] 和 str2[j - 1]为终点的公共子串长度
#include <stdio.h>
int main() {
char *str1 = (char *)malloc(301);
char *str2 = (char *)malloc(301);
scanf("%s %s", str1, str2);
int m = strlen(str1);
int n = strlen(str2);
if(m > n)
{
int tmp = m;
m = n;
n = tmp;
char str_tmp[301] = {0};
strcpy(str_tmp, str1);
strcpy((str1), str2);
strcpy(str2, str_tmp);
}
int dp[301][301] = {0}; //dp[i][j]代表以str1[i - 1] 和 str2[j - 1]为终点的公共子串长度
int i = 1;
int j = 1;
int maxlen = 0;
int index = 0;
for(i = 1; i <= m; i++)
{
for(j = 1; j <= n; j++)
{
if(str1[i - 1] == str2[j - 1])
{
dp[i][j] = dp[i -1][j - 1] + 1; //状态转移
if(dp[i][j] > maxlen)
{
maxlen = dp[i][j];
index = i - 1;
}
}
else {
dp[i][j] = 0; /*str1[i - 1] != str2[j - 1]则代表以str1[i - 1] 和
str2[j - 1]为终点的公共子串长度为0*/
}
}
}
for(int k = index - maxlen + 1; k <= index; k++)
{
printf("%c", str1[k]);
}
return 0;
}
