給定乙個字串 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...