21xrx.com
2024-12-27 14:42:59 Friday
登录
文章检索 我的文章 写文章
C++回文子串
2023-07-01 11:29:39 深夜i     --     --
C++ 回文 子串 字符串处理 算法优化

回文子串是指正反读都相同的字符串子序列。C++是一种高级编程语言,可以用来实现各种算法,包括回文子串的查找。

在C++中,我们可以用两种方法来查找一个字符串中的回文子串:暴力搜索和动态规划。暴力搜索方法会枚举所有可能的子串并判断是否为回文子串,这种方法的时间复杂度为O(n^3),对于较长的字符串来说效率较低。动态规划方法则是通过保存子串的信息来减少重复计算,并且可以在O(n^2)的时间内完成。

下面我们来看一种使用动态规划算法的C++代码实现:


#include <iostream>

#include <cstring>

using namespace std;

int main() {

  string s;

  cin >> s;

  int n = s.length();

  bool dp[n][n];

  memset(dp, false, sizeof(dp)); // 初始化dp数组为false

  int ans = 0; // 记录最长回文子串的长度

  for (int j = 0; j < n; j++) { // 枚举右边界

    for (int i = 0; i <= j; i++) { // 枚举左边界

      if (s[i] == s[j]) { // 当左右边界的值相等时,判断是否为回文子串

        if (j - i < 2) { // 特殊情况,当子串长度为1或2时一定为回文子串

          dp[i][j] = true;

        }

        else {

          if (dp[i+1][j-1]) { // 当前子串是否为回文子串取决于去掉左右边界后的子串是否仍为回文子串

            dp[i][j] = true;

          }

        }

      }

      if (dp[i][j]) { // 如果当前子串是回文子串,则更新最长回文子串的长度

        ans = max(ans, j-i+1);

      }

    }

  }

  cout << ans << endl;

  return 0;

}

这段代码使用一个二维布尔类型的dp数组来记录每个子串是否为回文子串。首先将数组初始化为false,然后从左到右和从上到下分别枚举每个子串的左右边界。当左右边界的值相等时,判断子串是否为回文子串,如果是则将dp数组中对应位置的值设为true。最后遍历完所有子串后,更新最长回文子串的长度并输出即可。

使用动态规划算法可以大大提高查找回文子串的效率,并且在处理大量数据时表现优异。对于需要查找回文子串的应用场景,C++是一种非常实用的工具。

  
  

评论区

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