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) { |