欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 每日OJ_牛客HJ75 公共子串计算

每日OJ_牛客HJ75 公共子串计算

2024/10/25 17:17:12 来源:https://blog.csdn.net/GRrtx/article/details/141144550  浏览:    关键词:每日OJ_牛客HJ75 公共子串计算

目录

牛客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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com