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...