给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
题解:
解题思路:中心拓展法,从当前字符向两端进行拓展(两个指针背向移动),每个位置都判断下,以该位置为中心的回文串最长为多少,遍历一遍,保留最长的那个
class Solution:
def longestPalindrome(self, s: str) -> str:
long_sub = ""
for i in range(len(s)):
odd = self.is_palindrom(s, i, i) # 回文串元素个数为奇数
even = self.is_palindrom(s, i, i + 1) # 回文串元素个数为偶数
long_sub = odd if len(odd) > len(long_sub) else long_sub
long_sub = even if len(even) > len(long_sub) else long_sub
return long_sub
def is_palindrom(self, s, l, r):
"""不超出边界且扩散的两边的元素相等,返回回文子串"""
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
return s[l + 1: r]
模拟:
s = 'babad' n = len(s) = 5
i = 0
奇数:l = 0, r = 0 ==> s[l] == s[r] ==> l = -1, r = 1 ===> s[0: 1] ==> long_sub = "b"
偶数: l = 0, r = 1 ==> s[l] != s[r] ===> s[0: 1] ==> long_sub = "b"
i = 1
奇数:l = 1, r = 1 ==> s[l] == s[r] ==> l = 0, r = 2 ===> l = -1, r = 3 ===> s[0: 3] ==> long_sub = "bab"
偶数: l = 1, r = 2 ==> s[l] != s[r] ===> s[2: 2] ==> long_sub = "bab"
....