題目來源:https://leetcode-cn.com/problems/longest-palindromic-substring/python
給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。算法
示例 1:segmentfault
輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。
示例 2:bash
輸入: "cbbd" 輸出: "bb"
class Solution: def longestPalindrome(self, s: str) -> str: length = len(s) if length < 2: return s max_sub_len = 1 start = 0 for i in range(length): # 同時對兩種狀況進行擴散 # 單字符的狀況,或者兩字符之間空隙爲中心的狀況 odd_sub_len = self.__expand_around_center(s, length, i, i) even_sub_len = self.__expand_around_center(s, length, i, i + 1) # 比較兩種狀況返回的子串長度,取大值 sub_len = max(odd_sub_len, even_sub_len) if sub_len > max_sub_len: max_sub_len = sub_len # 調整子串的起始位置, # 如果傳入相鄰的值,是以左邊值的索引爲基準的 # 這時中心在兩值之間的空隙,調整起始位置注意 -1 # 如果傳入的值是重合的,也就是字符爲中心,這種方法一樣適用,等同手動向下取整 start = i - (sub_len - 1) // 2 return s[start:start + max_sub_len] def __expand_around_center(self, s, length, left, right): # 若是傳入的值 left = right,是奇數迴文子串 # 若是傳入的值 left + 1 = right,也就是相鄰的值,則是偶數迴文子串 i = left j = right # 符合條件,向左右兩邊擴散 while i >= 0 and j < length and s[i] == s[j]: i -= 1 j += 1 # 返回子串的長度 return j - i -1
本次使用的方法是中心擴散的方法,解決最長迴文子串的問題。運用的思想就是迴文中心左右兩側互爲鏡像的原理。微信
還有一種方法叫 「Manacher 算法」,用以專門解決「最長迴文子串」的方法,這裏不展開說明。可是有興趣瞭解的話,推薦你們能夠看看下面這位做者在題解中關於這個算法的描述,看下來以爲很是詳細,很是 6。函數
以上就是本篇的主要內容
歡迎關注微信公衆號《書所集錄》