leetcode 最長回文子串 python

2021-09-19 16:35:41 字數 2316 閱讀 7603

解題思路

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

輸入:

"babad"

輸出:"bab"

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

輸入:

"cbbd"

輸出:"bb"

首先說一下我的偽**吧

1. 遍歷字串

2. 比較遍歷的兩個值是否相等(while迴圈來實現)

2.1 介於回文串分為aba,adda類,分兩種情況

2.1.1 i和i

2.1.2 i和i+

12.2 如果相等的話就分別向右與向左看,再比較是否相等

2.3while迴圈結束後返回子串的長度

3. 最後是判斷返回的子串長度是否是最長的

舉個例子,比如說字串「asdsf」

如果子串d的左邊等於s,右邊也等於s,那麼sds是否是子串呢,那就是了啊

這個演算法是把每乙個字元都當作中心來看待。

class

solution

:def

longestpalindrome

(self,s)

:if s is

none

andlen

(s)<1:

return

0 start = end =

0for i in

range

(len

(s)-1)

:#遍歷

len1 = self.expandaroundcenter(s,i,i)

#中心為單數

len2 = self.expandaroundcenter(s,i,i+1)

#中心為偶數

length =

max(len1,len2)

if length > end-start:

#判斷是否是最長的乙個回文子串

start = i-

(length-1)

//2end = i+length//

2return s[start:end+1]

#最後返回回文子串

defexpandaroundcenter

(self,s,l,r)

:while

0<=l<=r<

len(s)

and s[l]

== s[r]

:#判斷子串左右兩邊是否也相等

l -=

1 r +=

1return r-l-

1#返回子串長度

這道題我前後做過兩回,第一次做的時候,討論區說用馬拉車方法做,但是對於我來說看著真的很傷腦殼啊,我看的太陽穴痛。今天來做的時候這種方法很簡單,很易理解,但是終究不是最好的。

我們來看看大神的方案吧,52ms

class

solution

:def

longestpalindrome

(self, s:

'str')-

>

'str'

: length =

len(s)

if length <

2or s == s[::

-1]:

return s

max_len, begin =1,

0for i in

range(1

, length)

: odd = s[i - max_len -

1:i +1]

even = s[i - max_len:i +1]

if i - max_len >=

1and odd == odd[::

-1]:

begin = i - max_len -

1 max_len +=

2continue

if i - max_len >=

0and even == even[::

-1]:

begin = i - max_len

max_len +=

1return s[begin:begin + max_len]

最長回文子串 LeetCode 五 最長回文子串

題目 最長回文子串 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。題目解析 回文?當回文串長度為奇數時,比如 北京計程車租出京北 當回文串長度為偶數的時候,比如 1221 以上兩種情況有乙個共同的特點就是有乙個中心,那在 中如何表示中心呢?class solution ...

leetcode 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 中心拓展法 由乙個中心點開始向兩邊拓展,檢測邊界,判斷兩個值是否相等,相等則繼續拓展下去,檢測邊界。1....

最長回文子串(LeetCode)

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s type s str r...