事實上,只需使用恆定的空間,我們就可以在 o(n2) 的時間內解決這個問題。
我們觀察到回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n - 1 個這樣的中心。
你可能會問,為什麼會是 2n - 1 個,而不是 n 個中心?原因在於所含字母數為偶數的回文的中心可以處於兩字母之間(例如 「abba」 的中心在兩個 『b』 之間)。
class
solution
:def
longestpalindrome
(self, s:
str)
->
str:
""" 定義乙個檢查函式,
如果可以向兩邊擴充套件那麼左右索引各自加一
否則輸出此中心的最大回文長度
"""defexpandaroundcenter
(s:str
,l:int
,r:int)-
>
int:
while
(l>=
0and r<
len(s)
and s[l]
==s[r]):
l-=1 r+=
1"此處是減1,而不是加1,因為l,r是在判斷後加的1"
return r-l-
1
end=start=
0for i in
range
(len
(s))
:"判斷以i為中心的奇數長度"
len1=expandaroundcenter(s,i,i)
"判斷以i,i+1為中心的偶數長度"
len2=expandaroundcenter(s,i,i+1)
maxlen= len1 if len1>len2 else len2
if(maxlen>end-start)
:"""
此處需要減一,因為我們使用了取整,比如baab,maxlen=4
start==1-(4-1)//2==0
"""start=i-
(maxlen-1)
//2end=i+maxlen//
2return s[start:end+
1]
動態規劃與遞迴類似都把問題分解為子問題,dp適合子問題重疊,最優化方法.分析問題過程如下
1.分析問題空間
2.建立遞迴式(狀態轉移方程)
3.自底向上計算
4.記錄最優方案的詳細過程(可選)
在這個問題中,我們可以用到上一次的子問題
1.設p(i,j)為s[i,j]是否為回文子串,是的話為true,否則為false
2.可以得出 p(i,j)=true if s[i]==s[j] and p(i+1,j-1)
這就是狀態轉移方程,ok 問題得解.
3.從l=0 ->len(s) 分別計算子問題
4.把結果記錄在s[i,j+1]
class
solution
:def
longestpalindrome
(self, s:
str)
->
str:
t=len(s)
if(t==
0or t==1)
:return s
#建立二維陣列
p=[[
false
for i in
range
(t)]
for i in
range
(t)]
maxlen=
0#子問題從0 開始
for l in
range
(t):
#注意i的索引範圍
for i in
range
(t-l)
: j=i+l
if(s[i]
==s[j]
and(l<
2or p[i+1]
[j-1])
):p[i]
[j]=
true
if(l+
1>maxlen)
: maxlen=l+
1 ans=s[i:j+1]
return ans
另一種動態遞迴方法
利用的是上一次計算的最大長度
def
longestpalindrome
(self, s)
:"""
:type s: str
:rtype: str
"""iflen
(s)<
2or s == s[::
-1]:
return s
n =len(s)
start, maxlen =0,
1for i in
range(1
, n):
odd = s[i - maxlen -
1:i +1]
# even = s[i - maxlen:i +1]
#e.g cbabd i=3時 maxlen=1
if i - maxlen -
1>=
0and odd == odd[::
-1]:
start = i - maxlen -
1 maxlen +=
2continue
# e.g. bbbbbb i=3 時 maxlen=3
if i - maxlen >=
0and even == even[::
-1]:
start = i - maxlen
maxlen +=
1return s[start:start + maxlen]
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 方法1 用馬拉車演算法 字串動態規劃 來求最長回文子串時間複雜度可以達到o n 但是部落格裡面有個小失誤 這個id應該不是最大回文...
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s k len s olist...
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 這道題比較船艇的應該是dp求法,但鄙人的dp特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...