04Manacher
定义:如果字符串s的第一个字符等于最后一个字符,而第二个字符又等于倒数第二个字符,以此类推,那么该字符串就是一个回文字符串。“最长回文字符串”就是要找到一个最长子串,同时该子串是一个回文字符串。
输入:babcbabcbaccba
输出:abcbabcba
复杂度: O(n)
算法:
#coding=utf-8
"""
算法:字符串的最长回文子串Manacher
作者:lph-China
时间:2019/7/4
"""
def manacher(s):
assert '$' not in s and '^' not in s and '#' not in s
if s == '':
return (0, 1)
t = "^#" + "#".join(s) + "#s"
c = 0
d = 0
p = [0] * len(t)
for i in range(1, len(t) - 1):
mirror = 2 * c - i
p[i] = max(0, min(d - i, p[mirror]))
while t[i + 1 + p[i]] == t[i - 1 - p[i]]:
p[i] += 1
if i + p[i] > d:
c = i
d = i + p[i]
(k, i) = max((p[i], i) for i in range(1, len(t) - 1))
return s[(i - k) // 2 : (i + k) // 2]
if __name__ == '__main__':
s = 'babcbabcbaccba'
result = manacher(s)
print(result)