給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。
示例 1:
輸入: "babad"示例 2:輸出: "bab"
注意: "aba"也是乙個有效答案。
輸入: "cbbd"輸出: "bb"
簡單易於理解的解法
1class
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的時候也是需要我們去一步一步的求解
我在實現的時候只是給出最長回文串的乙個,
1class
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。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘...