學習筆記 最長回文子串

2021-10-09 11:07:51 字數 2257 閱讀 4411

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

class

solution

(object):

deflongestpalindrome

(self, s)

:"""

:type s: str

:rtype: str

"""for length in

range

(len

(s),-1

,-1)

:for index in

range(0

,len

(s)- length +1)

: sub_string = s[index:length + index]

if sub_string == sub_string[::

-1]:

return sub_string

暴力法採用雙指標兩邊夾,驗證是否是回文子串。

除了列舉字串的左右邊界以外,比較容易想到的是列舉可能出現的回文子串的「中心位置」,從「中心位置」嘗試盡可能擴散出去,得到乙個回文串。

中心擴散法的思路是:

列舉「中心位置」時間複雜度為 o(n),從「中心位置」擴散得到「回文子串」的時間複雜度為 o(n),因此時間複雜度可以降到 o(n^2)。

在這裡要注意乙個細節:回文串在長度為奇數和偶數的時候,「回文中心」的形式是不一樣的。

我們看一下乙個字串可能的回文子串的中心在**?

我們可以設計乙個方法,相容以上兩種情況:

1、如果傳入重合的索引編碼,進行中心擴散,此時得到的回文子串的長度是奇數;

2、如果傳入相鄰的索引編碼,進行中心擴散,此時得到的回文子串的長度是偶數。

class

solution

(object):

deflongestpalindrome

(self, s)

:"""

:type s: str

:rtype: str

"""size =

len(s)

if size <2:

return s

# 至少是 1

max_len =

1 res = s[0]

for i in

range

(size)

: palindrome_odd, odd_len = self.__center_spread(s, size, i, i)

palindrome_even, even_len = self.__center_spread(s, size, i, i +1)

# 當前找到的最長回文子串

cur_max_sub = palindrome_odd if odd_len >= even_len else palindrome_even

lenn =

len(cur_max_sub)

if lenn > max_len:

max_len = lenn

res = cur_max_sub

return res

def__center_spread

(self, s, size, left, right)

:"""

left = right 的時候,此時回文中心是乙個字元,回文串的長度是奇數

right = left + 1 的時候,此時回文中心是乙個空隙,回文串的長度是偶數

"""i = left

j = right

while i >=

0and j < size and s[i]

== s[j]

: i -=

1 j +=

1return s[i +

1:j]

, j - i -

1

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串 leetcode筆記

public static string longestpalindrome string s 定義最長子串的座標 int start 0,end 0 遍歷字串,以每個字元和字元的間隙為起點,進行中心擴充套件 for int i 0 i s.length i 返回子串 注意substring 方法 ...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...