题目概述:
题目注意点:
- 这里需要区分两种情况,奇数对称和偶数对称结构。
- 这里大佬,用到了一个牛逼的方法max(str1,str2,key=len)
解题思路:
- 中心扩散法,确认一个中心,往两边扩散查找,遇到不符合就提停止,返回扩散前一次的值。
- 区分奇数和偶数对称情况,遇到更好的就存下,最后返回结果
完整代码:
#中心扩散法Spread From Center
def spread(self, s, left, right):
"""
left = right 的时候,此时回文中心是一条线,回文串的长度是奇数
right = left + 1 的时候,此时回文中心是任意一个字符,回文串的长度是偶数
"""
# 当左右字符相等,且不超出范围,就继续判断
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return s[left + 1:right] # 这里left扩张以后,检测不符合,所以需要回退一个范围。所以left + 1
# right由于左闭右开,所以不用做处理
# 动态规划法-中心扩散法Spread From Center
def spread_from_center(self, s:str) -> str:
if s==s[::-1]:
return s
res = s[:1] # 初始化返回值,为第一个字符
for i in range(len(s)): # i是每次的中心位置
palindrome_odd= self.spread(s,i, i) # 中心位置落在字符上
palindrome_even= self.spread(s,i, i + 1) # 中心位置落在字符中间
# 当前找到的最长回文子串
res = max(palindrome_odd,palindrome_even,res,key=len)
return res
作者:boywithacoin_cn
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/pythonguan-jie-bao-li-fa-dong-tai-zhong-xin-kuo-sa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。