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.
Example 1
1 | Input: "babad" |
Example 2
1 | Input: "cbbd" |
解题思路
回文分两种,一种以字符为对称轴 aba
,一种以字符空隙为对称轴 abba
。构造回文可以从某个字符或者某个字符空隙开始。因此,可以遍历每个字符或字符空隙,并对其进行扩展,记录下最长的回文子串。
复杂度分析
- 时间复杂度:$O(n^2)$,遍历每个字符和字符空隙,并对其进行扩展,每次扩展需要$O(n)$时间复杂度。
- 空间复杂度:$O(1)$
代码
1 | class Solution { |
改进:Manacher 算法
首先,将两种情况统一为奇数的情况,通过添加 #
字符将原始字符串隔开,得到扩展字符串 es
。其次,维护当前访问到的 es
的右边界 mx
及其对应回文的中心位置 id
,i
为当前遍历到的位置,p[i]
是以 i
为中心的最长回文子串的半径(包括中心)。
当 i<mx
,会出现两种情况:
--mx'--|--j--|---id---|--i--|--mx--
--|-mx'--j----|---id-------i--mx--
第一种情况:p[i]=p[j]
;第二种情况,以 j
为中心的回文超出左边界 mx'
。若以 i
为中心的回文也超出右边界 mx
,则 mx
经过 i
再经过 id
再经过 j
的镜像与 mx'
重叠,意味着右边界应该为 mx+1
,与 mx
相矛盾。因此 p[i]=mx-i
。综上 p[i]=min(p[j],mx-i)
。
当 i>=mx
,继续用扩展法扩展右边界。
时间复杂度:$O(n)$
空间复杂度:$O(n)$
1 | string longestPalindrome(string s) { |