21xrx.com
2024-12-22 21:00:44 Sunday
登录
文章检索 我的文章 写文章
C++实现求解最长回文子串长度
2023-07-11 05:42:01 深夜i     --     --
C++ 求解 最长回文子串 长度

最长回文子串长度是指在一个字符串中最长的回文子串的长度,回文指的是正读和反读都一样的字符串。

实现求解最长回文子串长度的方法有多种,下面介绍一种基于动态规划的实现方法。

假设给定的字符串为s,设dp[i][j]表示s[i...j]是否为回文子串,如果是,则dp[i][j]为true,否则为false。则dp[i][j]的状态转移方程为:

if (s[i] == s[j] && dp[i+1][j-1])

  dp[i][j] = true;

其中,当s[i] == s[j]时,只有当s[i+1...j-1]也是回文子串时,s[i...j]才是回文子串。

最后再遍历dp数组,找到最长的回文子串长度。

完整的C++代码如下:

int longestPalindrome(string s) {

  int n = s.size();

  vector > dp(n, vector (n, false));

  int maxLen = 0;

  for (int len = 1; len <= n; ++len) {

    for (int i = 0; i + len - 1 < n; ++i) {

      int j = i + len - 1;

      if (len == 1)

        dp[i][j] = true;

      else if (len == 2)

        dp[i][j] = s[i] == s[j];

      else

        dp[i][j] = s[i] == s[j] && dp[i+1][j-1];

      if (dp[i][j])

        maxLen = max(maxLen, len);

    }

  }

  return maxLen;

}

在时间复杂度方面,该方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。

总体来说,使用动态规划可以非常高效地求解最长回文子串的长度,是一种优秀的解决方法。

  
  

评论区

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