【Leetcode】Python實現最長迴文子串
阿新 • • 發佈:2019-01-02
動態規劃實現
根據迴文的特性,一個大回文按比例縮小後的字串也必定是迴文,比如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))