最長迴文字符串Manachor算法

自己寫的計算最長迴文字符串長度的程序,測試時間太長不滿足要求。

我的思路是遍歷字符串,計算以每個字符爲中心的迴文長度,複雜度爲O(n^2);

上網查閱找到一個manachor算法複雜度爲O(n),算法很難理解,花費不少的時間去解讀,這裏簡單記錄一下。


  1. 首先Manachor通過用“#”字符將原字符串隔開,以此消除長度爲奇偶的影響;

  2. 充分利用迴文串的特點,計算半徑的最小值(核心部分)。下圖爲示例

    wKiom1VMxhXSkZ9vAABmQq3taNc507.jpg

    上圖中mx爲當前以pi位置爲中心的迴文串的右邊界,當計算p[i+1]時,利用對稱性,p[i+1]和p[i-1]對稱,已p[i+1]的半徑與p[i-1]一致;但是需要考慮mx的位置,即r(p[i+1]) = min{r(p[i-1]), mx - p[i+1]} (對稱部分,和越界部分)將1換成任意j都成立。


參考文獻鏈接:http://www.cnblogs.com/houkai/p/3371807.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章