当前位置:   article > 正文

每日OJ_牛客HJ65 查找两个字符串a,b中的最长公共子串

每日OJ_牛客HJ65 查找两个字符串a,b中的最长公共子串

目录

HJ65 查找两个字符串a,b中的最长公共子串

解析代码


HJ65 查找两个字符串a,b中的最长公共子串

查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网


解析代码

        本题是一道动态规划dp题,MCS[i][j]记录短字符串 s1 前 i 个字符和长字符串 s2 前 j 个字符的最长子串的长 度,初始化所有值为 0。当 s1[i-1] = s2[j-1]时,MCS[i][j] = MCS[i - 1][j - 1] + 1,这里使用一个额外的值 start 来记录最长子串在短字符串 s1 中出现的起始位置,maxlen记录当前最长子串的长度,当MCS[i][j] > maxlen 时,maxlen = MCS[i][j], 则start = i - maxlen ;档s1[i-1] != s2[j-1]时不需要任何操作,最后获取 substr(start, maxlen)即为所求。

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. string getComSubstr(string& str1, string& str2) // 寻求最短字符串
  6. {
  7. if (str1.size() > str2.size())
  8. swap(str1, str2);
  9. int len1 = str1.size();
  10. int len2 = str2.size();
  11. vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));
  12. int start = 0, max_size = 0;
  13. for (int i = 1; i <= len1; ++i)
  14. {
  15. for (int j = 1; j <= len2; ++j)
  16. {
  17. if (str2[j - 1] == str1[i - 1])
  18. MSC[i][j] = MSC[i - 1][j - 1] + 1;
  19. if (MSC[i][j] > max_size)
  20. {
  21. max_size = MSC[i][j];
  22. start = i - max_size;
  23. }
  24. }
  25. }
  26. return str1.substr(start, max_size);
  27. }
  28. int main()
  29. {
  30. string str1, str2;
  31. while (cin >> str1 >> str2)
  32. {
  33. string substr = getComSubstr(str1, str2);
  34. cout << substr << endl;
  35. }
  36. return 0;
  37. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/987458
推荐阅读
相关标签
  

闽ICP备14008679号