Leetcode 214. 最短回文串

用了Manacher算法,On复杂度

class Solution {
public:
    string shortestPalindrome(string s) {
        reverse(s.begin(),s.end());
        string s2="$#";
        for(auto& x:s)
            s2 += x ,s2+='#';
        s2+='@';
        int id=0,mx=0;
        vector<int> P(s2.size(),0);
        for(int i=1;i<s2.size();++i){
            if(mx>i) P[i]=min(P[2*id-i],mx-i);
            else P[i]=1;
            while(s2[i+P[i]]==s2[i-P[i]]) ++P[i];
            if(mx<P[i]+i) mx=P[i]+i,id=i;
            if(mx>=s2.size()-2) break; 
        }
        string t=string(s,0,s.size()-(P[id]-1));
        reverse(s.begin(),s.end());
        return t+s;
    }
};

猜你喜欢

转载自blog.csdn.net/bendaai/article/details/81154631