LeetCode 5 最長回文子串 動態規劃)

2021-09-11 03:25:14 字數 1612 閱讀 7984

1.動態規劃 時間複雜度o(n^2) 空間複雜度o(n^2)

大體思路就是 

如果 "aba"是回文的 那麼"aabaa" 也一定是回文的 因為就是在兩邊加上了相同的

所以從最小的 "a" "aa" "aba" 這種開始 逐漸擴張 找到最大的乙個

class solution:

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""matrix = [[0 for i in range(len(s))]for i in range(len(s))]

longeststr=""

longestlen=0

if len(s)==1:

return s[0]

# i在右邊

for j in range(len(s)):

for i in range(0,j+1):

if s[i]==s[j]:

# 包含一元二元三元

if j-i<=1:

matrix[i][j]=1

if longestlen<(j-i+1):

longestlen=j-i+1

longeststr=s[i:j+1]

# 擴張

else:

if matrix[i+1][j-1]==1:

matrix[i][j]=1

if longestlen<(j-i+1):

longestlen=j-i+1

longeststr=s[i:j+1]

return longeststr

2.但是第一種方法用上了二維陣列所以記憶體占用很大

所以改進後空間複雜度為o(n)更實用

class solution:

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""n=len(s)

olist=[0]*n

nlist=[0]*n

longestlen=0

longeststr=""

for j in range(n):

for i in range(0,j+1):

# 包含一元二元三元

if s[i]==s[j]:

# 當 j 時,第 i 個子串為回文子串

if j-i<=1:

nlist[i]=1

if longestlen < j-i+1:

longestlen = j-i+1

longeststr = s[i:j+1]

else:

# 當j-i>1時,判斷當j-1時,第i+1個子串是否為回文子串

if olist[i+1]==1:

nlist[i]=1

if longestlen<(j-i+1):

longestlen=j-i+1

longeststr=s[i:j+1]

olist=nlist

nlist=[0]*n

return longeststr

LeetCode5最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...

LeetCode 5 最長回文子串

問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...

leetcode5 最長回文子串

遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...