5. 最长回文子串
给你一个字符串 s
,找到 s
中最长的
回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
🚩 思路1:通过中心扩散双指针来计算最长回文串,这里需要注意的是奇偶数,如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符。
class Solution:
# 那么可以事先写一个函数,在 s 中寻找以 s[left] 和 s[right] 为中心的最长回文串(即s[left]==s[right],然后在不越界的前提下左移left,右移right),
# 这样,如果输入相同的 left 和 right,就相当于寻找长度为奇数的回文串,如果输入相邻的 left 和 right,则相当于寻找长度为偶数的回文串
def spread(self, s, left, right):
while left >= 0 and right < len(s) and s[left] == s[right]: # 防止索引越界
left -= 1 # 双指针,向两边展开,左往左,右往右
right += 1
return s[left + 1: right] #返回以 s[left] 和 s[right] 为中心的最长回文串, 结束循环时left比回文串的内容多左移了一个 right多右移了一个
def longestPalindrome(self, s:str)->str:
if s == s[::-1]:
return s
res = []
for i in range(len(s)):
res_odd = self.spread(s, i, i) # 找到以 s[i] 为中心的回文串,奇数的时候
res_even = self.spread(s, i, i + 1) # 找到以 s[i]和s[i+1] 为中心的回文串,偶数的时候
res.append(res_odd)
res.append(res_even)
res_sort = sorted(res, key=lambda x: len(x))
return res_sort[-1]
🚩 思路2:暴力遍历法,遍历每个元素时,遍历后面的元素,只有相等的时候才有可能是回文串,把这两个首尾字符的字符串进行回文判断,找到最长的即可。这种方法就是慢一些。
class Solution:
def longestPalindrome(self, s:str)->str:
n = len(s)
ans = s[0]
if n == 1:
return ans
for i in range(len(s)):
for j in range(i+1, len(s)):
if s[i] == s[j]:
res = s[i: j+1]
if res == res[::-1] and len(res) > len(ans):
ans = res
return ans