5. 最长回文子串
思路
找回文串的难点在于,回文串的的长度可能是奇数也可能是偶数,解决该问题的核心是从中心向两端扩散的双指针技巧。
如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符。
之前的左右指针都是从两端向中间相向而行,而回文子串问题则是让左右指针从中心向两端扩展。
代码
Python
class Solution:
def longestPalindrome(self, s: str) -> str:
res = ""
for i in range(len(s)):
# 以 s[i] 为中心的最长回文子串(最长回文子串长度为奇数)
s1 = self.palindrome(s, i, i)
# 以 s[i] 和 s[i+1] 为中心的最长回文子串(最长回文子串长度为偶数)
s2 = self.palidrome(s, i, i + 1)
# res = longest(res, s1, s2)
res = res if len(res) > len(s1) else s1
res = res if len(res) > len(s2) else s2
return res
def palidrome(self, s: str, l: int, r: int) -> str:
# 防止索引越界
while l >= 0 and r < len(s) and s[l] == s[r]:
# 向两边展开
l -= 1
r += 1
# 此时 s[l + 1 ~ r - 1] 就是最长回文串
# Python 的字符串切片是左闭右开区间 [start, end)
return s[l + 1: r]
浙公网安备 33010602011771号