5 最長回文子串

2021-09-24 16:58:32 字數 2817 閱讀 4599

題目

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

【分析】本題有多種方法,例如中心擴散法,馬拉車(manacher)演算法,動態規劃法。

個人理解中心擴散法和馬拉車演算法都類似。其核心思想都是利用雙指標從中間向兩邊開始判斷是否符合回文串特徵(左右對稱)。

回文串有兩種,一種是奇數長度的回文串,一種是偶數長度的回文串。奇數長度的是從中間某個元素開始向兩邊擴散(s[left]==s[right]),偶數長度的是從中間某兩個元素開始向兩邊擴散。

所以在中心擴散法中分兩種情況,一種是奇數回文串時,left=right開始迭代;另一種是偶數回文串時,right=left+1開始迭代。

而在馬拉車演算法中,把所有的字串長度全部化為奇數的情況:新增分隔符。然後left=right同時向兩邊迭代,直到遇到邊界條件為止。

class solution:

def longestpalindrome(self, s):

s='#'+'#'.join(s)+'#' #新增分隔符

size=len(s)

if len(s)==2:

return ""

p= #得到p陣列

【動態規劃法】首先定義狀態,設f(i

,j)f(i,j)

f(i,j)

表示子串s[i

,j]s[i,j]

s[i,j]

是否是回文串,若是則為1,否則為0;

其次確定狀態轉移方程:

f (i

,j)=

s[i]==s[j],\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad j-i\leq 1 \\ s[i]==s[j] \quad and \quad f(i+1,j-1)==1,j-i>1 \end\right.

f(i,j)

={s[

i]==

s[j]

,j−i

≤1s[

i]==

s[j]

andf

(i+1

,j−1

)==1

,j−i

>1​

直觀上,

i

ii為內迴圈,j

jj為外迴圈;i≤j

i \leq j

i≤j,同時保證在得到f(i

+1,j

−1)f(i+1,j-1)

f(i+1,

j−1)

的基礎上再來得出f(i

,j)f(i,j)

f(i,j)

的結果(所以先迴圈j:r

ange

(len

(s))

j:range(len(s))

j:rang

e(le

n(s)

),再迴圈i:r

ange

(j+1

))i:range(j+1))

i:rang

e(j+

1))。

因為$ f(i,j)==1一定會

有一定會有

一定會有

f(i+1,j-1)==1,所以

先保證,所以先保證

,所以先保證

f(i+1,j-1)==1,然後

判斷子串

的首尾,然後判斷子串的首尾

,然後判斷子

串的首尾

s[i]==s[j]$ ,由此來得出$ f(i,j)$

class solution:

def longestpalindrome(self, s: str) -> str:

size = len(s)

if size<=1:

return s

dp=[[0]*size for _ in range(size)]

len_max=1 #記錄最大回文串的長度

index=0 #記錄最大回文串的首字元索引

for j in range(size):

for i in range(j+1):

## 狀態轉移:

if j-i<=1 and s[i]==s[j]:

dp[i][j]=1

elif j-i>1 and s[i]==s[j] and dp[i+1][j-1]==1:

dp[i][j]=1

##記錄最大回文串資訊:

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