''' mbinary ######################################################################### # File : manacher.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-07-06 15:56 # Description: ######################################################################### ''' class Solution: def longestPalindrome(self, s): """ :type s: str :rtype: str """ n = len(s) s2 = '$#'+'#'.join(s)+'#@' ct = [0]*(2*n+4) mid = 1 for cur in range(1, 2*n+2): if cur < mid+ct[mid]: ct[cur] = min(ct[2*mid-cur], mid+ct[mid]-cur) else: ct[cur] = 1 while s2[cur-ct[cur]] == s2[cur+ct[cur]]: ct[cur] += 1 if cur+ct[cur] > mid+ct[mid]: mid = cur mx = max(ct) idxs = [i for i, j in enumerate(ct) if j == mx] p = idxs[0] for i in idxs: if s2[i] == '#': p = i rst = s2[p-mx+1:p+mx].replace('#', '') return rst