【题目】
给定一个字符串str,返回str中最长回文子串的长度。要求时间复杂度O(N)。
【进阶题目】
给定一个字符串str,想通过添加字符的方式使得str整体都变成回文字符串,但要求只能在str的末尾添加字符,请返回在str后面添加的最短字符串。要求时间复杂度O(n)。
#File Name : manacher 算法.py
def manacherString(string):
# 这一个函数只是 把每一个位置都加上 ‘#’
# 奇数与1作与运算,结果肯定是1,偶数为0,用于判断奇数偶数位
# 说明是偶数位0,2,4,...
res = [0 for i in range(len(string)*2+1)]
index = 0
for i in range(len(res)):
if i & 1 == 0:
res[i] = '#'
else:
res[i] = string[index]
index+=1
return res
def maxLcpsLength(str1):
if str1 == None or len(str1) == 0:
return 0
#每个位置都记上‘#’
mStr = manacherString(str1)
#数组用于记录以每个字符为中心,最长回文半径
help = [0 for i in range(len(mStr))]
index = -1
# c 取得边界r时候的回文中心
right = -1
#最右边界right
maxLen = 0
for i in range(len(mStr)):
if right>i:
#i 在 right 里面
# 第一种 i的对称i1的回文在里面 则i的与i1的回文长度数值一样
# 第二种 i的对称i1的回文没在里面 则为r-i
help[i] = min(right-i,help[2*index-i])
else:
#i在right外面,暴力
help[i] = 1
# 每种情况都扩一下,情况2和3 就会失败 1和4 需要扩
while i+help[i]<len(mStr) and i-help[i]>-1:
#当 i位置再加上他的回文半径就到了最后 小于字符的长度,没到最后
#并且 i减去回文半径 大于-1 没到头
if mStr[i+help[i]] == mStr[i-help[i]]:
help[i]+=1
else:
break
if i+help[i] > right:
right = i+help[i]
index =i
maxLen = max(maxLen,help[i])
return maxLen-1
a = 'deabcbake'
print(maxLcpsLength(a))