
回文的特点: 左右对称
所以可以:以每个位置为中心,向两边扩展,看看能扩多长
回文有两种:
python
//奇数长度(aba):中心是一个字符
中心
↓
a
/ \
b b
// 偶数长度(abba):中心是两个字符
中心
↓
b b
/ \
a a
举个例子
遍历过程:
i=0 → "b"
i=1 → "bab" ✅
i=2 → "aba" ✅
i=3 → "a"
i=4 → "d"
👉 最终结果:"bab" 或 "aba"
时间:O(n²)
空间:O(1)
python
class Solution:
def longestPalindrome(self, s: str) -> str: #时间:O(n²), 空间:O(1)
start = 0
max_len = 1
# 辅助函数,左右相等时,循环往外扩展
def expand(left, right): # 以left/right为中心点(可能left=right)
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1 # 跳出循环时,回文长度
for i in range(len(s)):
len1 = expand(i, i) # 奇数长度回文,中心点只有一个left=right
len2 = expand(i, i + 1) # 偶数长度回文,中心点只有2个left,left+1
curr_max = max(len1, len2) ## 取更长的
# 更新最长回文
if curr_max > max_len:
max_len = curr_max
# 计算这个回文的起点 start
# 举例:i=2, len=3 (aba) -> start = 2 - (3-1)//2 = 1
# 举例:i=2, len=4 (abba) -> start = 2 - (4-1)//2 = 1
start = i - (curr_max - 1) // 2
return s[start : start + max_len]