解題思路
給定乙個字串 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...