法一、中心扩散法:以字符串某元素(奇数扩散中心,对应子串长度为奇数)或某两相同元素中间(偶数扩散中心,对应子串长度为偶数)为中心,分别向两端扩散,如果两端元素相同,则继续扩散,不相同则退出,保留当前子串;更换中心元素,直至找到最长回文子串。
class Solution:
def longestPalindrome(self, s: str) -> str:
s_len = len(s)
if s_len == 0:
return ''
_palindrome_len = 1
_palindrome_str = s[0]
for i in range(s_len):
palindrome_odd, odd_len = self._center_spread(s, s_len, i, i)
palindrome_even, even_len = self._center_spread(s, s_len, i, i+1)
# 调用函数,分别以s[i](子串长度为奇数)、s[i]和s[i+1]的中间(长度为偶数)为中心进行扩散,寻找最长回文子串
cur_max_str = palindrome_odd if odd_len > even_len else palindrome_even
if len(cur_max_str) > _palindrome_len:
_palindrome_len = len(cur_max_str)
_palindrome_str = cur_max_str
return _palindrome_str
def _center_spread(self, s , s_len, left, right): # 定义寻找最长回文子串函数
l = left
r = right
while l >= 0 and r < s_len and s[l] == s[r]:
l -= 1
r += 1
return s[l+1 : r], r - l - 1 # 注意此处s[l+1 : r]是输出s[l+1], s[l+2], ... s[r-1]