最长公共子串

秒速五厘米 2021-10-19 05:48 509阅读 0赞

最长公共子串(注意子串是连续的,也是与最长公共子序列的区别)

1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程

2、状态转移方程:
if(str1[i] == str2[i])   array[i][j]=array[i-1][j-1]+1;  (左上方对角线的值加上1)
  否则无操作。

3、最后寻找整个array中的最大值即可(因为可能有多个子串)示意(图中有两个公共子串,分别为”ab”和”de”,长度都为2)

在这里插入图片描述
代码:

  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4. #include <string.h>
  5. #include <sstream>
  6. using namespace std;
  7. int LCS_length(const string &str1, const string &str2, vector<vector<int> > &veca) {
  8. int i, j;
  9. int biggest = 0;
  10. if (str1 == "" || str2 == "")
  11. return 0;
  12. for (i = 0; i <= str1.length(); i++) {
  13. veca[i].resize(str2.length() + 1, 0);
  14. }
  15. for (j = 0; j <= str2.length(); j++) {
  16. veca[0][j] = 0;
  17. }
  18. for (i = 1; i <= str1.length(); i++) {
  19. for (j = 1; j <= str2.length(); j++) {
  20. if (str1[i - 1] == str2[j - 1]) {
  21. veca[i][j] = veca[i - 1][j - 1] + 1;
  22. if (veca[i][j] > biggest)
  23. biggest = veca[i][j];
  24. }
  25. else
  26. //可以看出,求最长子串和求最长子序列差别仅仅在这里
  27. veca[i][j] = 0;
  28. }
  29. }
  30. return biggest;
  31. }
  32. int main() {
  33. string input;
  34. getline(cin, input);
  35. stringstream ss(input);
  36. string str1;
  37. ss >> str1;
  38. string str2;
  39. ss >> str2;
  40. vector<vector<int> > veca(str1.length() + 1);
  41. cout << LCS_length(str1, str2, veca) << endl;
  42. return 0;
  43. }

如果想输出串,只需要在biggest = veca[i][j];下面加上一句代码保存下标或者j即可,然后根据下标和串的长度即可输出公共子串。

发表评论

表情:
评论列表 (有 0 条评论,509人围观)

还没有评论,来说两句吧...

相关阅读

    相关 公共

    最长公共子串(注意子串是连续的,也是与最长公共子序列的区别) 1、先建立一个二维数组array\[str1.size()\]\[str2.size()\](全部初始化为0