Longest Palindromic Substring 题解

题目来源:Longest Palindromic Substring

> Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

解题思路:

暴力搜索, \(O(N^2) \)

最简单的方法就是选中i(0~n-1),然后向两边扩展,复杂度为\(O(N^2) \) . 注意回文长度可能是奇数或者偶数, 即 aba or abba

string longestPalindrome(string s) 
{
  int n = s.length();
  if (n <= 1) return s;
  int start = 0; int maxLen = 1;
  for(int i = 0; i < n; i++)
  {
      //center: i
      int left = i - 1;
      int right = i + 1;
      while(left >= 0 && right < n
          && s[left] == s[right])
          --left, ++right;
      //s[left] != s[right] , s[left+1 : right-1] is palindrome
      int len = (right-1) - (left+1) + 1;
      if(len > maxLen)
          start = left+1, maxLen = len;
      //center: between s[i] and s[i+1]
      if(i+1 < n && s[i] == s[i+1])
      {
          left = i;
          right = i+1;
          while(left >= 0 && right < n
              && s[left] == s[right])
              --left, ++right;
          len = (right-1) - (left+1) + 1;
          if(len > maxLen)
              start = left+1, maxLen = len;
      }
  }
  return s.substr(start, maxLen);
}

或者可以这样,将中间相同的字符跳过,不考虑奇数还是偶数的串(其实还是考虑了,也包括在内了)。

DP, \(O(N^2) \)

dp[i][j] 表示 s[i:j] 是回文, 当且尽当s[i] == [j] && dp[i+1][j-1], 即计算dp[i][j]时, dp[i+1][j-1]得先计算出来,算dp[x][i],必须先把dp[x][i-1]先计算出来了来。

计算s[:5]的结果,先得把所有s[:4]结尾的回文算出来了来。 上面比如在算dp[i][5]时,用到了dp[x][4],在上面的循环中,dp[x][4]已经算出来了的。 另外,虽然都是平方的算法,上面用vector还过不了,用数组才能过。

\( O(n) \) 算法, Manacher 算法

felix021的文章讲得很清楚,这里“偷”过来。

>

代码如下:

Last updated

Was this helpful?