目录
牛客HJ75 公共子串计算
解析代码
牛客HJ75 公共子串计算
公共子串计算_牛客题霸_牛客网
解析代码
求最大公共子串,使用递推实现 假设 x(i):字符串第i个字符 y(j):字符串第j个字符 dp[i][j]:以x(i),y(j)结尾的最大子串长度。比如:x: "abcde" y:"bcdae" dp[2][1]:以x(2),y(1)结尾的最大子串长度即:x遍历到"abc",y遍历 到"bc",都以字符'c'结尾时最大公共子串为"bc" 。故:当计算dp[i][j]时,首先看x(i),y(j)的值:
- x(i) == y(j) 当前两个字符串结尾的字符相等,dp[i][j] = dp[i-1][j-1] + 1 即个它的长度加1
- x(i) != y(j) 当前两个字符 串结尾的字符不相等,说明没有以这连个字符结尾的公共子串 即dp[i][j] = 0
- dp[0][j] 和 dp[i][0]表示以 某个子串的第一个字符结尾,最大长度为1如果x(0) == y(j) 或者 x(i) == y(0), 则长度为1,否则为0当dp中的所有元素计算完之后,从中找打最大的值输出。
#include <iostream>
using namespace std;
int main()
{
string str1 = "", str2 = "";
cin >> str1 >> str2;
int n1 = str1.size(), n2 = str2.size();
int res = -1;
for (int i = 0; i < n1; ++i)
{
for (int j = 0; j < n2; ++j)
{
int cnt = 0;
int tmpi = i, tmpj = j;
while (tmpi < n1 && tmpj < n2 && str1[tmpi++] == str2[tmpj++])
{
++cnt;
}
res = max(res, cnt);
}
}
cout << res << endl;
return 0;
}