演算法之Manacher

2021-07-27 22:48:45 字數 1214 閱讀 4773

計算乙個最長回文子串行的樸素演算法的時間複雜度為o( n^2 ),而該演算法使時間複雜度降至o( n )。

該演算法利用的原理為:當乙個小回文序列在乙個大回文序列中時,其小回文序列在大回文序列的對稱位置的序列與原小回文序列一致。

利用這個原理,可以減少單一回文序列的計算量。

另外,為使**更加簡練,可以對初始字串進行處理,使回文序列的長度變成奇數。

get_panlindromic_string_length( s, pos, r )

l = 2*pos - r

while l >= 0 and r < s.size

if s[l++] != s[r++]

return r - pos - 1

return r - pos

manacher( s )

let c is a array.

pos = 0

c[0] = 0

for i=1 to s.size

r = i

l = 2*ptr - r

if c[pos] + ptr <= r

c[i] = get_panlindromic_string_length( s, i, i+1 )

else if l - c[l] > pos - c[pos]

c[r] = c[l]

else

c[i] = get_panlindromic_string_length( s, i, pos + c[pos] )

if r + c[r] > pos + c[pos]

pos = r

return c

class manacher

;manacher::manacher( std::string str, char* buf )

;int manacher::getpanlindromicstringlength( int pos, int r )

}return r-pos;

}int manacher::getmaximumlength( int* buf )

else

if( r+buf[r] > pos+buf[pos] )

}int result = -1;

for( int i=0; iresult )

}return result-1;

}

Manacher演算法之個人愚見

這個俗稱 馬拉車 的演算法的適用問題比較侷限,是manacher在解決尋找字串中最長回文時提出的一種時間複雜度為o n 的演算法。廢話不多說,直接講演算法 字串預處理 首先,在解決回文型別的演算法題目時,經常會很頭疼的問題就是最終解的回文中字元總數是奇數還是偶數,即abba與aba兩種型別,比如判斷...

Manacher演算法總結

所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。下面介紹manacher演算法的原理與步驟。首先,manacher演算法提供了一種巧妙地辦法,將長度為奇數的回文串和長度為偶數的回文串一起考慮,具體做法...

Manacher演算法總結

演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個 演算法,manacher 演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp 演算法有很多共通支出,所以...