📅  最后修改于: 2023-12-03 15:28:48.311000             🧑  作者: Mango
本题为门|门IT 2006年的第10道问题,题目为求字符串中最长回文子串的长度,要求在O(n)的时间复杂度内解决。
可借鉴Manacher算法,一种时间复杂度为O(n)的算法,用于找出一个字符串的最长回文子串。Manacher算法实际上是对中心扩展算法的一种优化。
步骤如下:
def manacher(s):
# 在每个字符的左右都插入一个特定字符'#'
s = '#' + '#'.join(s) + '#'
n = len(s)
p = [0] * n
maxRight = pos = resCenter = resLen = 0
for i in range(n):
# 先快速计算出p[i]
if i < maxRight:
p[i] = min(p[2 * pos - i], maxRight - i)
else:
p[i] = 1
# 向两侧扩展
while i - p[i] >= 0 and i + p[i] < n and s[i - p[i]] == s[i + p[i]]:
p[i] += 1
# 更新maxRight和pos
if i + p[i] > maxRight:
maxRight = i + p[i]
pos = i
# 更新最长回文子串的中心和长度
if p[i] > resLen:
resLen = p[i]
resCenter = i
return resLen - 1 # 最长回文子串的长度为半径-1