給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: 「babad」
輸出: 「bab」
注意: 「aba」 也是乙個有效答案。
示例 2:
輸入: 「cbbd」
輸出: 「bb」
方法一:暴力法
class
solution
:# 暴力匹配(超時)
deflongestpalindrome
(self, s:
str)
->
str:
# 特判
size =
len(s)
if size <2:
return s
max_len =
1 res = s[0]
# 列舉所有長度大於等於 2 的子串
for i in
range
(size -1)
:for j in
range
(i +
1, size)
:if j - i +
1> max_len and self.__valid(s, i, j)
: max_len = j - i +
1 res = s[i:j +1]
return res
def__valid
(self, s, left, right)
:# 驗證子串 s[left, right] 是否為回文串
while left < right:
if s[left]
!= s[right]
:return
false
left +=
1 right -=
1return
true
方法二:動態規劃
乙個回文去掉兩頭以後,剩下的部分依然是回文(這裡暫不討論邊界情況);
依然從回文串的定義展開討論:
如果乙個字串的頭尾兩個字元都不相等,那麼這個字串一定不是回文串;
如果乙個字串的頭尾兩個字元相等,才有必要繼續判斷下去。
如果裡面的子串是回文,整體就是回文串;
如果裡面的子串不是回文串,整體就不是回文串。
dp[i][j] 表示子串 s[i…j] 是否為回文子串,這裡子串 s[i…j] 定義為左閉右閉區間,可以取到 s[i] 和 s[j]。
dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]
class
solution
:def
longestpalindrome
(self, s:
str)
->
str:
size =
len(s)
if size <2:
return s
dp =[[
false
for _ in
range
(size)
]for _ in
range
(size)
] max_len =
1 start =
0for i in
range
(size)
: dp[i]
[i]=
true
for j in
range(1
, size)
:for i in
range(0
, j)
:if s[i]
== s[j]
:if j - i <3:
dp[i]
[j]=
true
else
: dp[i]
[j]= dp[i +1]
[j -1]
else
: dp[i]
[j]=
false
if dp[i]
[j]:
cur_len = j - i +
1if cur_len > max_len:
max_len = cur_len
start = i
return s[start:start + max_len]
5 最長回文子串 python
題目 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。start,maxlen 0,0 def longestpalinrome s if len s 2 return s for i in range len s extendpal s,i,i extendpal s,...
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...