最長回文子串(LeetCode)

2021-09-04 13:29:55 字數 1791 閱讀 3312

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

示例 1:

輸入:"babad"輸出:"bab"注意:"aba" 也是乙個有效答案。
示例 2:

輸入:"cbbd"輸出:"bb"
class solution:

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""length = len(s)

if length == 0 or length == 1:return s #長度為0為1時,最長回文子串都是它本身

string = "" #記錄最長回文子串 

max_len = 0 #記錄子串的長度

for i in range(0,length):                  #對於長度是偶數的回文串,定會出現s[i] = s[i+1]

if i+1 < length and s[i] == s[i+1]:#回文串長度是偶數.如abba,則會出現s[1] = s[2]。然後往兩邊擴張。

j = i

k = 0

while j - k >= 0 and j + k + 1 < len(s):

if s[j-k] == s[j+k+1]:

k += 1 

else:

break

if 2 * k  > max_len:

max_len = 2 * k  #回文串的長度等於2 * k

string = s[j-k+1:j+k+1]        #對於長度是奇數的回文串,定會出現s[i] = s[i+2]

if i+2 < length and s[i] == s[i+2]:#回文串長度是奇數.如ababa,則會出現a[1] = a[3]

j = i + 1

k = 0

while j - k >= 0 and j + k < len(s):

if s[j-k] == s[j+k]:

k += 1

else:

break

if 2 * k - 1 > max_len:

max_len = 2 * k - 1 #回文串長度為 2 * k - 1

string = s[j-k+1:j+k] #擷取比上乙個回文串更長的回文串

if string == "":return s[0]

else:return string

說實話,對於字串題,我一直是拒絕的。因為字串的各種演算法實在是比較難理解。

我不僅一次遇到過這個題,但這是第一次坐下來慢慢思考的。

顯然這個題可以用暴力法破解,但超時與否,我想應該是會超的。畢竟演算法複雜度已經達到了o(n3)。

於是想到,對於乙個長度為奇數的回文串一定會出現s[i] = s[i+2],而長度為偶數的回文串一定會出現s[i] = s[i+1]。此時再向兩邊擴張,便可得乙個完整的回文串。這樣的演算法時間複雜度為o(n2),值得一試。

後來做是做出來了,只不過不夠理想。後來看了官方題解,我的老哥,居然還有時間複雜度為o(n)的演算法。。實在是把我驚呆了。。(演算法名為manacher,俗稱馬拉車法)

本想把**貼出來好好解說一番,只是期末臨近,學業繁重,只好留待以後再說罷。

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

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

leetcode 最長回文子串

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

LeetCode 最長回文子串

中文版 英文版的直接把 cn 刪除就可以訪問了 接下來是題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 首先,我們看到題目以後的想法是什麼呢...