5 最長回文子串

2021-10-23 13:29:23 字數 2811 閱讀 6229

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入:「babad」

輸出:「bab」

注意:「aba」 也是乙個有效答案。

示例 2:

輸入:「cbbd」

輸出:「bb」

我們觀察乙個回文子串「adbcbda」,則「dbcbd」,「bcb」,也是回文子串,同理,如果"bcb"是回文子串,則「dbcbd」和「adbcbda」也一定是回文子串。

所以這個問題可以轉化為,如果區間[i,

j]

[i,j]

[i,j

]確定為回文子串,則判斷區間[i−

1,j+

1]

[i-1,j+1]

[i−1,j

+1]是否是回文子串,這個思路和分治法不同在於,是否進行判斷區間[i−

1,j+

1]

[i-1,j+1]

[i−1,j

+1]依賴與區間[i,

j]

[i,j]

[i,j

]確定為回文子串,即進行下一步需要確定當前步驟是正確的。(符合最優化原理)

需要考慮以下情況:

p(i,j) & = & true \\ p(i,j+1) & = & (s_i==s_j) \\ p(i,j) & = & p(i+1,j-1)∧(s_i==s_j) \end \right.

⎩⎪⎨⎪⎧​

p(i,

j)p(

i,j+

1)p(

i,j)

​===

​tru

e(si

​==s

j​)p

(i+1

,j−1

)∧(s

i​==

sj​)

dp[

i][j

]dp[i][j]

dp[i][

j]表示子串 s[i

..j]

s[i..j]

s[i..j

] 是否為回文子串,這裡子串 s[i

..j]

s[i..j]

s[i..j

] 定義為左閉右閉區間,可以取到 s[i

]s[i]

s[i]

和 s[j]

s[j]

s[j]。dp[

i][j

]=(s

[i]=

=s[j

])an

ddp[

i+1]

[j−1

]dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]

dp[i][

j]=(

s[i]

==s[

j])a

nddp

[i+1

][j−

1]

class

solution

:def

longestpalindrome

(self, s:

str)

->

str:

n=len(s)

res=(0

,'')#res[0]記錄長度,res[1]記錄回文子串

dp=[[

0]*n for _ in

range

(n)]

for j in

range

(n):

for i in

range

(j+1):

if s[i]

==s[j]

and(j-i+

1<=

3or dp[i+1]

[j-1])

:#當子串長度為1或2時,判斷本身是否構成回文子串

#當子串長度大於等於3時,檢查dp[i+1][j-1]是否構成回文子串

dp[i]

[j]=

1 cur=s[i:j+1]

iflen

(cur)

>res[0]

: res=

(len

(cur)

,cur)

return res[

1]

由長到短列舉所有可能子串,直到找到第乙個回文子串

可以用雙指標優化

class

solution

:def

longestpalindrome

(self, s:

str)

->

str:

for s_length in

range

(len

(s),-1

,-1)

:for i in

range(0

,len

(s)-s_length+1)

: sub_string = s[i:i+s_length]

if sub_string == sub_string[::

-1]:

return sub_string

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特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...