马拉车算法是一种能在O(n)的时间复杂度范围内得出结果。我看了不下几次这个算法,每次都觉得有点懂了,但是一碰到题目了,就生生写不出来。归根揭底,还是没有掌握其思想。
- 马拉车算法的第一个核心思想就是往原始的字符串里填充一些辅助的东西,使得我们在考虑问题时不用考虑字符串长度是奇数还是偶数。因为对于回文字符串来说,长度是奇数偶数时判断是有些不同的
- 第二个核心思想就是用到了回文字符串的对称性。
下面附上代码:
def manacher(s):
s = '$'+'#'.join(s)+'#'
print(s)
half = [0]*len(s)
mid, max_right = 0, 0
maxLen = 0
for i in range(len(s)):
if i < max_right:
half[i] = min(half[2*mid-i], max_right-i)
else:
half[i] = 1
while i - half[i] >= 0 and i + half[i] < len(s) and s[i-half[i]] == s[i+half[i]]:
half[i] += 1
if max_right < i + half[i] - 1:
max_right = i + half[i] - 1
mid = i
if maxLen < half[i]:
maxLen = half[i]
res = s[i-half[i]+1:i+half[i]]
print(res.replace('#', ''))
print(half)
array = "abaedsasd"
manacher(array)