5 求解最長迴文子串
阿新 • • 發佈:2021-02-16
leetcode – 5 求解最長迴文子串 – python
看了一下排名在前的程式碼,使用的是兩重迴圈, 對字串和反轉的字串進行比較,判斷是否是迴文串
class Solution:
def longestPalindrome(self, s):
size = len(s)
if size < 2: # 空串和一個字元都是迴文
return s
max_length = 1
start = 0 # 用來儲存當前最長迴文串的第一個字元下標
# 建立二維陣列,長度為size*size,將此二維陣列上的所有格子的值設定為False
dp = [[False for _ in range(size) ]for _ in range(size)]
# 對角線上的字串都是迴文串
for i in range(size):
dp[i][i] = True
# 二重迴圈字串,尾指標j從1開始到字串結尾, 頭指標i從0開始到j結束
for j in range(1, size):
for i in range(0, j):
if s[i] == s[j]: # 首尾字元相同
if j- i < 3: # 並且字串長度小於4,一定是迴文串
dp[i][j] = True
else:
# 本級子串是否是迴文串, 取決於下層本級子串的子串,如果
# 子串的子串是迴文串,那麼本機子串一定是迴文串
# 這就是動態規劃演算法的關鍵:使用下層已經解決的問題來解決上層問題
dp[i][j] = dp[i+1][j-1]
else:
dp[i][j] = False
if dp[i][j]: # 如果是迴文串,判斷是否是最長迴文串
cur_len = j - i + 1 # 當前迴文串的長度
if cur_len > max_length:
max_length = cur_len
start = i