21xrx.com
2024-09-20 05:58:13 Friday
登录
文章检索 我的文章 写文章
C++代码:求解最长公共子串
2023-07-01 20:39:49 深夜i     --     --
C++ 代码 最长公共子串 求解

最长公共子串是指在两个字符串中同时出现的最长连续子串。求解最长公共子串对于许多字符串匹配问题都非常重要。在这篇文章中,我们将介绍如何使用C++代码来求解最长公共子串。

首先,我们应该确定如何定义最长公共子串。假设我们有两个字符串A和B,它们的长度分别为N和M。那么最长公共子串应该满足以下条件:

1. 它是A和B的子串。

2. 它在A和B中出现的位置是连续的。

3. 它的长度最大。

现在我们已经确定了最长公共子串的定义,接下来介绍一种基于动态规划的解法。

我们可以使用一个二维数组L[N+1][M+1],其中L[i][j]表示以A[i-1]和B[j-1]结尾的最长公共子串长度。也就是说,L[i][j]表示A和B中以i和j结尾的最长公共子串长度。

那么怎样求解L[i][j]呢?我们可以遍历A和B的所有子串,如果发现相同的子串,就更新L[i][j],同时记录下此时的最大长度和最大长度的起始位置。

具体的实现可以参考以下C++代码:


int LCS(string A, string B) {

  int N = A.length();

  int M = B.length();

  int L[N+1][M+1];

  int maxLength = 0, maxEnd = 0;

  memset(L, 0, sizeof(L));

  for (int i = 1; i <= N; i++) {

    for (int j = 1; j <= M; j++) {

      if (A[i-1] == B[j-1]) {

        L[i][j] = L[i-1][j-1] + 1;

        if (L[i][j] > maxLength) {

          maxLength = L[i][j];

          maxEnd = i - 1;

        }

      }

    }

  }

  cout << "最长公共子串长度为:" << maxLength << endl;

  cout << "最长公共子串为:";

  for (int i = maxEnd - maxLength + 1; i <= maxEnd; i++) {

    cout << A[i];

  }

  cout << endl;

  return maxLength;

}

使用上面的代码,我们可以求出两个字符串中的最长公共子串以及其长度。值得注意的是,这个算法的时间复杂度为O(NM),空间复杂度也是O(NM)。

总的来说,使用C++代码求解最长公共子串并不难。只需要理解它的基本定义以及用动态规划方法实现即可。在实际使用中,我们可能会进一步优化算法以提高代码效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复