2016-05-18~21:资料
2016-05-22 本文已影响20人
袁一帆
刷刷题
# abacabcaba -> ^#a#b#a#c#a#b#c#a#b#a#$
# r:最右边回文边界,c:最长回文中心
def manacher(_s):
s = '#'.join('^{}$'.format(_s))
c,r,n = 0,0,len(s)
p = n*[0]
for i in xrange(1,n-1):
if r<i:p[i]=0 #超过最右边际则初始化为0
else:p[i]=min(r-i,p[2*c-i]) #由回文的对称性,未超过最右边界的时候,可以找到当前最大回文
while s[i+1+p[i]] == s[i-1-p[i]]: #以当前i为中心,向左右寻找回文
p[i]+=1
if i+p[i]>r: #更新最右边界和最长回文中心
c,r = i,p[i]+i
maxl,maxi = max((n,i) for i,n in enumerate(p)) #找到最大回文中心的长度
return _s[(maxi-maxl)/2:(maxi+maxl)/2]
print manacher('abacabcaba')