5 最長回文子串

2021-09-14 04:08:32 字數 3149 閱讀 2354

事實上,只需使用恆定的空間,我們就可以在 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特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...