Manacher算法

Manacher(馬拉車)算法用于處理字符串最長回文子串問題,其精妙之處在于:通過特殊處理原字符串,統(tǒng)一處理了偶回文與奇回文。

首先特殊處理:ABBBACD ===> #A#B#B#B#A#C#D#(coding技巧:在首尾添加其他特殊符號,免去邊界判斷)

算法的核心其實是對已經(jīng)判斷過的字符串的信息保存并重復(fù)利用,類似動態(tài)規(guī)劃。

例如:ABBBACD的以第二B為軸心(對稱性),第三個B可以利用到第一個B的信息

# A # B # B # B # A # C # D #
1 3 1 2 1 3 1 2 1 2 1 2 1 2 1
  • 算法時間復(fù)雜度:O(N)
  • 空間復(fù)雜度:O(N)

leetcode:5. 最長回文子串

class Solution {
public:
    string longestPalindrome(string s) {
        string str = "!#";
        for(int i = 0; i < s.size(); i++){
            str.push_back(s[i]);
            str.push_back('#');
        }
        str += "@";
        // 軸心
        int c = 0;
        // 最右邊界
        int r = 0;
        int max = 1;
        vector<int> vec(str.size());
        for(int i = 1; i < str.size(); i++){
            if(i < r)
                vec[i] = min(vec[2*c-i], r - i);
            else
                vec[i] = 1;
            while(str[i + vec[i]] == str[i - vec[i]])
                vec[i]++;
            if(r < i + vec[i]){
                r = i + vec[i];
                c = i;
            }
            
            if(vec[i] > vec[max])
                max = i;
        }
        string res="";
        for(int i = max - vec[max] + 2; i < max + vec[max]; i+=2)
            res += str[i];
        return res;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容