給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:輸入:「babad」
輸出:「bab」
注意:「aba」 也是乙個有效答案。
示例 2:我們觀察乙個回文子串「adbcbda」,則「dbcbd」,「bcb」,也是回文子串,同理,如果"bcb"是回文子串,則「dbcbd」和「adbcbda」也一定是回文子串。輸入:「cbbd」
輸出:「bb」
所以這個問題可以轉化為,如果區間[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特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...