描述
对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
数据范围: 1≤𝑛≤1000
要求:空间复杂度 𝑂(1),时间复杂度 𝑂(𝑛2)
进阶: 空间复杂度 𝑂(𝑛),时间复杂度 𝑂(𝑛)
示例1
输入:"ababc"
返回值:3
说明:最长的回文子串为"aba"与"bab",长度都为3
示例2
输入:"abbba"
返回值:5
示例3
输入:"b"
返回值:1
基础版
class Solution:
def getLongestPalindrome(self, A: str) -> int:
n = len(A)
if n == 0:
return 0
def expand_around_center(left: int, right: int) -> int:
while left >= 0 and right < n and A[left] == A[right]:
left -= 1
right += 1
return right - left - 1 # 返回当前中心扩展出的回文长度
max_len = 1
for i in range(n):
# 以单个字符为中心扩展(奇数长度的回文)
len1 = expand_around_center(i, i)
# 以两个字符之间的缝隙为中心扩展(偶数长度的回文)
len2 = expand_around_center(i, i + 1)
max_len = max(max_len, len1, len2)
return max_len
进阶版
class Solution:
def getLongestPalindrome(self, A: str) -> int:
# 预处理字符串,插入特殊字符
T = '#'.join(f'^{A}$')
n = len(T)
P = [0] * n
C = R = 0 # C是当前回文的中心,R是当前回文能到达的最右边界
for i in range(1, n - 1):
P[i] = (R > i) and min(R - i, P[2 * C - i]) # 找到i的镜像i_m
# 尝试扩展回文
while T[i + P[i] + 1] == T[i - P[i] - 1]:
P[i] += 1
# 更新中心和边界
if i + P[i] > R:
C, R = i, i + P[i]
# 找到最长回文子串的长度
max_len = max(P)
return max_len