最長回文字串

2021-08-21 12:00:41 字數 1089 閱讀 6960

比如:

s = "fggfsrtrsa"

返回 "srtrs"

解題思路:

其實最簡單的可以用動態規劃,時間複雜度為o(n^2),這種解法就不加贅述了。我這裡會介紹時間複雜度為o(n)的演算法:

manacher演算法:

這樣做的乙個好處是:無論原字串長度是奇是偶,都能變成奇數長度2*len(s)+1:

比如比如

所以顯而易見,最長回文字串的長度就是max(len)-1!最長回文字串的中點就在max(len)所在位置!

從這裡就能看出新增「#」的另乙個好處:

無論什麼情況,乙個回文字串都可以以「從中心點發散」的形式表示,這樣就能對應到s中的每個點!

不新增「#」,在遇到偶數回文串的時候就沒法從中心點發散,比如

上述的例子,最後擷取出來為

具體**(python3):

def longestpalindrome(self, s):

''':param s: str

:return: str

'''s = list(s) #將str變為list

len =

length = len(s)

for i in range(0, 2*length+1, 2): #在偶數字插入符號

s.insert(i,'#')

for i in range(len(s)):

n = 1

try:

while s[i-n] == s[i+n]:

n += 1

except indexerror:

pass

max_len = max(len)

location = len.index(max_len) #最長的len在s列表中的位置

palindrome = s[location - max_len + 1: location + max_len - 1]

while '#' in palindrome:

palindrome.remove('#')

return ''.join(palindrome) #list變為str

最長回文字串

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

最長回文字串

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

最長回文字串

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