動態規劃 最長回文子串

2021-10-03 06:10:44 字數 2614 閱讀 4626

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba" 也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。

解法一:動態規劃法

為什麼可以用動態規劃呢?

那麼,乙個字串是否是回文就取決於其子串是否是回文。

根據以上思路書寫**:

class solution(object):

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""size = len(s)

if size < 2: # 考慮特殊狀態,無字元或單字元直接返回其本身

return s

dp = [[false] * size for i in range(size)] # 初始化狀態矩陣

max_length = 1 # 初始化最大長度

start = 0 # 初始化最大回文起點

for i in range(size): # 初始化對角線(單字元為回文)

dp[i][i] = true

for j in range(1, size): # 終點從s[1]開始

for i in range(0, j): # 起點從s[0]開始,到s[j]結束

if s[i] == s[j]: # 頭尾字元相等

if j - i < 3: # 長度小於3,2~0字元此時均可判斷為回文

dp[i][j] = true

else: # 取決於子字串的狀態(是否為回文)

dp[i][j] = dp[i+1][j-1]

else:

dp[i][j] = false # 頭尾不相等,一定不是回文

if dp[i][j]: # 每確定乙個回文,更新一次最大長度和回文起點

cur_length = j - i + 1

if cur_length > max_length:

max_length = cur_length

start = i

return s[start:start + max_length]

時間複雜度:空間複雜度:

解法二:中心擴散法

動態規劃法相當於從大字串回溯到小字串來完成判斷,那麼能不能從中間某個字元開始向外擴散實現判斷呢?

中心擴散法就是這樣的思想,以字串中任意乙個字元為初始點,向左右逐單位擴散,若擴散後還是回文,則繼續擴散,否則記錄起點和回文長度。

根據字串長度的不同,分為奇數中心和偶數中心:

設計一種演算法,相容這兩種情況。

class solution(object):

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""n = len(s)

if n < 2: # 特殊情況,單字元或空字元

return s

max_length = 1

ans = s[0]

for i in range(n):

palindrome_odd, max_odd = self.find_palindrome(s, n, i, i)

palindrome_eve, max_eve = self.find_palindrome(s, n, i, i + 1)

palindrome = palindrome_eve if max_eve >= max_odd else palindrome_odd

if len(palindrome) >= max_length: # 每次都更新最大回文及其長度

max_length = len(palindrome)

ans = palindrome

return ans

def find_palindrome(self, s, n, i, j): # 從中心開始擴散,尋找最大回文及其長度

while i >= 0 and j < n and s[i] == s[j]:

i -= 1

j += 1

return s[i+1:j], (j - i - 1) # 最後一次迴圈後i和j多改變了一次

時間複雜度:空間複雜度:

解法三:馬拉車演算法

暫時放置。。

參考:

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...

最長回文子串 動態規劃

給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...

最長回文子串 動態規劃

vj原題 輸入乙個字串str,輸出str裡最長回文子串的長度。回文串 指aba abba cccbccc aaaa這種左右對稱的字串。串的子串 乙個串的子串指此 字元 串中連續的一部分字元構成的子 字元 串 例如 abc 這個串的子串 空串 a b c ab bc abc input 輸入str s...