Longest Palindromic Substring

Published: 28 Aug 2014 Category: 技术

题目

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.

思路

方法一: 暴力法

将每个 (start, end) 对都检查一次,如果是回文,比较其长度与当前最大长度。有 O(n^2) 个这样的数对,每个检查是否为回文用 O(n) 时间,总时间为 O(n^3). 空间 O(1)

方法二:动态规则

暴力法中判断回文其实做了许多重复的事情。以下是动态规则表达式:

d[i:j] = True if d[i+1:j-1] == True and s[i] == s[j]

O(n^2) 时间, O(n^2) 空间。

方法三:Manacher 算法

算法基于回文子串中,中心对称的两点,以他们为回文中心的字符串有对称关系,将时间复杂度降低为 O(n)


-----------------------------
    L mi      C     i  R

C 是一个回文序列中心, L 和 R 是其左右边界。假如 P[i] 代表以 i 为中心的最大回文序列的长度。

如果以 mi 为中心的最大回文序列,其左边界小大于 L, 那么 P[i] = P[mi] ,因为 s[L:C-1] 与 s[C+1, R] 是左右对称的。

如果以 mi 为中心的最大回文序列,其左边界小于 L, 那么 不能确定 P[i] 与 P[mi] 是否相等,但 P[i] 右边界至少可到达 R. 此时 以 i 为中心,向左右扩张,一直到左右边界字符不相等。即可找到以 i 为中心的最大回文字符串。如果 i 右边界大于 R. 此时,中心 C 变为 i, R 变为 i 右边界。开始下一循环。