代码一:Manacger算法
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
def manacherString(s):
res='#'
for c in s:
res=res+c+'#'
return res
mans=manacherString(s)
ls = len(s)
if ls<2:
return s
ls=2*ls+1
mymax=-2**32
index=-1
pArr = [0]*ls
pr=-1
start=0
for i in range(ls):
pArr[i] = min(pArr[2*index-i],pr-i) if pr > i else 1
while i+pArr[i] < ls and i-pArr[i] > -1:
if mans[i+pArr[i]] == mans[i-pArr[i]]:
pArr[i]+=1
else:
break
if i+pArr[i] > pr:
pr = i+pArr[i]
index = i
if pArr[i]>mymax:
mymax = pArr[i]
start = i
mymax-=1
return mans[start-mymax+1:start+mymax+1:2]
代码二:简单易懂 头尾遍历
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
#分两种情况 1. aba这种 2.aaaaa这种 其中1包括2
n = len(s)
start = 0
maxlen = 0
for i in range(n):
if i-maxlen >=1 and s[i-maxlen-1:i+1] == s[i-maxlen-1:i+1][::-1]:
start = i - maxlen -1
maxlen += 2
continue
if i - maxlen >=0 and s[i-maxlen:i+1] == s[i-maxlen:i+1][::-1]:
start = i - maxlen
maxlen += 1
return s[start:start+maxlen]