当前位置:   article > 正文

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

每日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中的所有元素计算完之后,从中找打最大的值输出。
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. string str1 = "", str2 = "";
  6. cin >> str1 >> str2;
  7. int n1 = str1.size(), n2 = str2.size();
  8. int res = -1;
  9. for (int i = 0; i < n1; ++i)
  10. {
  11. for (int j = 0; j < n2; ++j)
  12. {
  13. int cnt = 0;
  14. int tmpi = i, tmpj = j;
  15. while (tmpi < n1 && tmpj < n2 && str1[tmpi++] == str2[tmpj++])
  16. {
  17. ++cnt;
  18. }
  19. res = max(res, cnt);
  20. }
  21. }
  22. cout << res << endl;
  23. return 0;
  24. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/987435
推荐阅读
相关标签
  

闽ICP备14008679号