5 最長回文子串(Python)

2021-10-23 07:06:21 字數 2306 閱讀 1437

給定乙個字串 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...