最大回文子串manacher演算法python

2021-08-20 01:26:38 字數 1216 閱讀 2202

關於最大回文子串問題,有兩種處理方法:

1.以每個字元為中心,向兩邊尋找回文子串,遍歷整個陣列後,返回最長的。

該方法時間複雜度較大為o(n^2)

2.乙個中等難度的動態規劃演算法:馬拉車

step1:給每個字元左右都加上特殊字元比如'#',處理後,能使字串s長度為奇

step2:現在的問題變成如何高效求得rl陣列

定義:rl:是乙個回文半徑陣列

rl[i]:以第i個字元為對稱軸的回文半徑

maxright:當前訪問到的所有回文串中最右邊的字元位置

pos:maxright對應回文串的對稱軸所在位置

i:第i個字元

j:i關於pos的對稱點

(1):i在maxright右邊:就是說以i為對稱軸的回文串還沒被訪問。

這時,以i為中心向兩邊擴充套件,當達到邊界or字元不相等時停止。

(2):i在maxright左邊:掃到了一部分以i為對稱軸的子串。

這時,令以i為對稱軸的回文半徑rl【i】=min(rl[j],maxright-i)

然後再以i為中心向兩邊擴充套件,直到左!=右且到達邊界

最後更新maxright=max(maxright,rl[i]+i-1)且若maxright變,pos會變為pos=i

很抽象,上**:

# -*- coding:utf-8 -*-

#@author:xinxinzhang

def manacher(s):

s='#'+'#'.join(s)+'#'#step1

rl=[0]*len(s) #各種初始化一下,rl是回文半徑陣列

maxright=0

pos=0

maxlen=0

for i in range(len(s)):

if i=0 and i+rl[i]maxright:

maxright=rl[i]+i-1

pos=i

#更新最長回文子串的長;

maxlen=max(maxlen,rl[i])

s=s[rl.index(maxlen)-(maxlen-1):rl.index(maxlen)+(maxlen-1)]

s=s.replace('#','')

return s

print(manacher('cbbd'))

PHP實現 Manacher 最大回文子串演算法

題目 給乙個字串,找出它的最長的回文子串行的長度。例如,如果給定的序列是 bbabcbcab 則輸出應該是7,babcbab 是在它的最長回文子串行。輸入 aaaa 1212asdfdsa1144121輸出 47這裡我們還是將其封裝成函式呼叫 回文序列就是正向和反向完全一樣的序列,比如asdfdsa...

O n 時間求 最長回文子串 Manacher演算法

回文字串分為奇回文和偶回文,在字串中間插入任意字元使得串變成奇回文串 暴力思想 肯定是找乙個點往兩邊任意擴充套件,遍歷一次,manacher時間為o n 開乙個陣列p記錄 以點i為中點 的最長回文串的半徑,假設前i 1個點的p都已經求出來來,現在考慮p i 如何推導 重點 r是p 1 p i 1 中...

(Manacher)演算法 O n 回文子串

資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...