1. 程式人生 > >【Leetcode】Python實現最長迴文子串

【Leetcode】Python實現最長迴文子串

動態規劃實現

根據迴文的特性,一個大回文按比例縮小後的字串也必定是迴文,比如ABCCBA,那BCCB肯定也是迴文。所以我們可以根據動態規劃的兩個特點:
(1)把大問題拆解為小問題
(2)重複利用之前的計算結果
這道題。如何劃分小問題,我們可以先把所有長度最短為1的子字串計算出來,根據起始位置從左向右,這些必定是迴文。然後計算所有長度為2的子字串,再根據起始位置從左向右。到長度為3的時候,我們就可以利用上次的計算結果:如果中心對稱的短字串不是迴文,那長字串也不是,如果短字串是迴文,那就要看長字串兩頭是否一樣。這樣,一直到長度最大的子字串,我們就把整個字串集窮舉完了。

class Solution
(object):
def longestPalindrome(self, s): """ :type s: str :rtype: str """ # 使用動態規劃,用空間換時間,把問題拆分 # 獲取字串s的長度 str_length = len(s) # 記錄最大字串長度 max_length = 0 # 記錄位置 start = 0 # 迴圈遍歷字串的每一個字元 for i in
range(str_length): # 如果當前迴圈次數-當前最大長度大於等於1 並 字串[當前迴圈次數-當前最大長度-1:當前迴圈次數+1] == 取反後字串 if i - max_length >= 1 and s[i-max_length-1: i+1] == s[i-max_length-1: i+1][::-1]: # 記錄當前開始位置 start = i - max_length - 1 # 取字串最小長度為2,所以+=2,s[i-max_length-1: i+1]
max_length += 2 continue # 如果當前迴圈次數-當前最大長度大於等於0 並 字串[當前迴圈次數-當前最大長度:當前迴圈次數+1] == 取反後字串 if i - max_length >= 0 and s[i-max_length: i+1] == s[i-max_length: i+1][::-1]: start = i - max_length # 取字串最小長度為1,所以+=1,s[i-max_length: i+1] max_length += 1 # 返回最長迴文子串 return s[start: start + max_length] if __name__ == '__main__': s = "babad" # s = "cbbd" sl = Solution() print(sl.longestPalindrome(s))