最長回文字串

2022-07-31 10:48:11 字數 3167 閱讀 1131

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

簡單易於理解的解法

1

class

solution(object):

2def

longestpalindrome(self, s):

3"""

4:type s: str

5:rtype: str

6"""

7 n =len(s)

8 maxl, maxr, max =0, 0, 0

9for i in

range(n):10#

長度為偶數的回文字串

11 start =i

12 end = i + 1

13while start >= 0 and end 14if s[start] ==s[end]:

15if end - start + 1 >max:

16 max = end - start + 1

17 maxl =start

18 maxr =end

19 start -= 1

20 end += 1

21else:22

break

2324

#長度為奇數的回文子串

25 start = i - 1

26 end = i + 1

27while start >= 0 and end 28if s[start] ==s[end]:

29if end - start + 1 >max:

30 max = end - start + 1

31 maxl =start

32 maxr =end

33 start -= 1

34 end += 1

35else:36

break

37return s[maxl:maxr + 1]

3839 s='

abcba

'40 str=solution.longestpalindrome(1,s)

41print(str)

檢視資料找到了manacher演算法 

這個演算法是以每乙個字元為中心, 向兩邊發散,同時,用乙個陣列p來記錄以每乙個字元為中心的回文串的一半的長度.

先看一下該演算法的核心.

確定以第i個字元為中心的回文串長度,建立在p[1:i-1]這個陣列基礎上

假設, mx為當前字串中已經確定的回文串的最有端. po為以mx為右端的回文串的中心,

這時候,我們需要確定 第i個字元的位置是 > ma 還是 i <= mx

如果 i <= mx 就是當前要確定的字元包含在前面的某個回文串裡面, 回文串是對稱的, 所以找到i 相對於po的對稱位置 j, 

接下來, 我們要做的就是判斷, ①p[j] >= mx - i  or ②p[j] < mx - i

在第一種情況, 就是說以i為中心的回文串還有向 mx右邊伸展的可能, 然而那一部分還是未知數, 就的一步一步的去求解, 第二種情況, 就是 p[j] <= mx - i, 根據回文串的堆成性質, 可以確定

p[i] = p[j]

當i > mx的時候也是需要我們去一步一步的求解

我在實現的時候只是給出最長回文串的乙個, 

1

class

solution:

2def

longestpalindrome(self, s):

3"""

4:type s: str

5:rtype: str

6"""

7 s1 = '

#' + '

#'.join(s) + '#'

8 length =len(s1)

9 p = [0] *length

10 i =0

11 id, mx =0, 0

12while i 13if mx >i:

14 p[i] = min(mx - i, p[2 * id -i])

15else

:16 p[i] = 1

17while (i - p[i] >= 0) and (i + p[i] < length) and (s1[i - p[i]] == s1[i +p[i]]):

18 p[i] += 1

19if (i - 1 + p[i]) >mx:

20 mx = i - 1 +p[i]

21 id =i

22 i += 1

23 max_length =max(p)

24 index_id =p.index(max_length)

25 s = s1[index_id + 1 - max_length:index_id +max_length]

26 s2 = ''

27for i in s.split('#'

):28 s2 +=i

29return

s230 s='aa'

31 str=solution.longestpalindrome(1,s)

32print(str)

第二種方法還不太明白,為什麼要加『#』號

最長回文字串

scanf s 輸入字串碰到空格或者tab就會停下來。此處可以使用fgets或者gets 另外注意標頭檔案cctype中的函式的巧妙使用,此處使用isalpha和toupper簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...

最長回文字串

回文串定義 回文串 是乙個正讀和反讀都一樣的字串,比如 asddsa 或者 lovekevol 等等就是回文串。回文子串,顧名思義,即字串中滿足回文性質的子串。這裡我給出通過 列舉回文串的中間位置i,然後不斷向外擴充套件,直達有字元不相同。注意,這裡長度為奇數和偶數的處理方式是不一樣的。下面給出 這...

最長回文字串

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘...