最長回文串演算法

2021-07-09 17:51:33 字數 2519 閱讀 9270

總的來說,最長回文串演算法分為以下幾種。

通過遍歷整個字串來說實現對最長回文串的查詢

首先乙個字串所有子串,個數為n2個,然後逐個判斷遍歷即可,演算法複雜度o(n3)

**如下:

def

is_palindrome

(s):

str_length = len(s)

for i in range(str_length / 2):

if s[i] != s[str_length - 1 - i]:

return

false

return

true

# 暴力求解法

defalgorithm1

(s):

length = len(s)

for i in range(length):

for j in range(i + 1):

if is_palindrome(s[j: length - i + j]):

return len(s[j: length - i + j])

return

1

該演算法感覺是manacher演算法的前身吧,使用字元中心向兩側擴充套件,這樣,只需要進行遍歷字串一次,然後針對每個字元進行單獨的判斷即可。

**如下:

def

change

(s):

l =

for c in s:

return

"@#%s#" % "#".join(l)

# 中心求解法

defalgorithm3

(s):

s = change(s)

flag = 0

for i in range(2, len(s) - 2):

temp = 1

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

temp += 1

if temp > flag:

flag = temp

return flag - 1

其實中心求解法完全可以不修改字串,不過那樣處理起來比較麻煩,**寫起來費力一些。

這是乙個比較牛掰的演算法,其實感覺是對中心擴充套件法的優化,但是我搞了好久才大體搞明白,主要因為其中有幾個難點

這個方法的牛掰之處就在於它的演算法複雜度是o(n)的,想出暴力解法很簡單,但是直觀來看,演算法複雜度差太多了。

因為manacher有個核心定義,叫做p[i]

p[i] : 以i為中心的的回文半徑長度

因為該陣列,所以必須對字串進行變換。因為當且僅當回文為奇數長度字串,才可能存在p[i]這種定義

python實現的**如下:

def

change

(s):

l =

for c in s:

return

"@#%s#" % "#".join(l)

# manacher演算法

defalgorithm4

(s):

s = change(s)

p = [0] * len(s)

index = 0

for i in range(2, len(s) - 2):

if p[index] + index > i:

p[i] = min(p[2 * index - i], p[index] + index - i)

else:

p[i] = 1

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

p[i] += 1

if index + p[index] < i + p[i]:

index = i

return max(p) - 1

其中有個判斷,為 p[index] + index > i

其代表的意思可以結合p陣列的概念進行理解, p[index]為以index為中心的回文半徑長度,index為其索引值,

所以 p[index] + index的意思為以index為核心的回文輻射範圍

if p[index] + index > i:說明下乙個遍歷點,在以index為核心的回文輻射範圍之內,既然在輻射範圍之內,說明p的起始計算位置至少要從p[2 * index -i],或者p[index] + index - i開始。

這裡比較繞。

這裡解釋一下

兩者的概念很類似,其實主要就是看對稱點的,根據對稱點p[2 * index - i],如果該值超過了p[index]的輻射範圍,那麼就取值p[index] + index -i,否則就取值本身。

說起來比較繞,其實自己畫個圖發現這個還是比較容易理解的。

這個演算法在我看來,是比之前中心演算法的乙個優化,但是我一點都看不出來為什麼該演算法的複雜度為o(n),後來看了很多別人的講解。

manacher演算法只需要線性掃瞄一遍預處理後的字串。

經過優化後,p是求解過程中,對字串的每個字元,掃瞄最多隻會2次,時間複雜度必然為o(n)

最長回文串演算法

給定乙個字串找出最長回文字串範圍,例如abaabac,最長回文為abaaba 1 使用暴力的演算法需要o n 3 的複雜度,需要o n 2 的複雜度去運算字串所用的子串,然後使用o n 去判斷是否是回文串,從而定位最長的回文子串。cpp int lps bl char str,int len int...

最長回文串 演算法 4 求解最長回文子串

問題描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。注釋 回文通俗的說就是正著念和反著念都一樣,如 上海自來水來自海上。示例 1 輸入 dabccbac 輸出 abccba 示例 2 輸入 cbbd 輸出 bb 解題思路 此處撰寫解題思路 遍歷每乙個索引,...

Manacher最長回文串演算法

在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...