Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd" Output: "bb"
解答:
class Solution:
def preProcess(self, s):
length = len(s)
if length == 0:
return '^$'
ret = '^'
for i in range(length):
ret += '#' + s[i]
ret += '#$'
return ret
def longestPalindrome(self, s):
'''
1) 维护C, L, R, 使R最大
2)如果关于C的镜像在[L,R]内,则p[i] = p[i']
3) 不在[L, R]内则从R+1开始验证
'''
C = R = 0
s = self.preProcess(s)
maxlen = len(s)
P = [0 for i in range(maxlen)]
for i in range(1, maxlen-1):
i_ = 2*C - i
P[i] = min(R-i, P[i_]) if R > i else 0
while s[i + 1 + P[i]] == s[i - 1 - P[i]]:
P[i] += 1
if i + P[i] > R:
C = i
R = i + P[i]
max = center = 0
for i in range(maxlen):
if P[i] > max:
max = P[i]
center = i
return ''.join([x for x in s[center-max : center+max] if x != '#'])