动态规划法
def longestPalindromeDP(s: str) -> str:
n = len(s)
dp = [[False] * n for _ in range(n)]
ans = ""
# 遍历长度
for l in range(n):
# 遍历起点
for i in range(n - l):
j = i + l
if l == 0:
dp[i][j] = True
elif l == 1:
dp[i][j] = (s[i] == s[j])
else:
dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
if dp[i][j] and l + 1 > len(ans):
ans = s[i:j + 1]
return ans
中心扩散法
def longestPalindromeCenter(s: str) -> str:
def expandAroundCenter(left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return s[left + 1:right]
if len(s) < 1:
return ""
longest = ""
for i in range(len(s)):
str1 = expandAroundCenter(i, i)
str2 = expandAroundCenter(i, i + 1)
longest = max(longest, str1, str2, key=len)
return longest
Manacher 算法
def preProcess(s: str) -> str:
if not s:
return "^$"
T = "^"
for i in range(len(s)):
T += "#" + s[i]
T += "#$"
return T
def longestPalindromeManacher(s: str) -> str:
T = preProcess(s)
P = [0] * len(T)
center, right = 0, 0
for i in range(1, len(T) - 1):
i_mirror = 2 * center - i
if right > i:
P[i] = min(right - i, P[i_mirror])
while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
P[i] += 1
if i + P[i] > right:
center, right = i, i + P[i]
max_len, center_index = max((n, i) for i, n in enumerate(P))
start = (center_index - max_len) // 2
return s[start:start + max_len]