s4553711
7/12/2017 - 3:02 PM

214.cpp

class Solution {
public:
    string shortestPalindrome(string s) {
        if (s == "") return s;
        string s2 = s;
        reverse(s2.begin(), s2.end());
        string news = s + "#" + s2;
        int n = news.size();
        vector<int> next(n+1);
        buildNext(news, next, n);
        if (next[n] > s.size()) {
            next[n] = (next[n] - s.size())*2;
        }
        string pres = s.substr(next[n]);
        reverse(pres.begin(), pres.end());
        return pres + s;
        
        // if(s == "")
        //     return s;
        // string s2 = s;
        // reverse(s2.begin(), s2.end());
        // string news = s + s2;
        // int n = news.size();
        // vector<int> next(n+1);
        // buildNext(news, next, n);
        // if(next[n] > s.size())
        //     next[n] = next[n] + 1 - s.size();
        // string pres = s.substr(next[n]);
        // reverse(pres.begin(), pres.end());
        // return pres + s;        
    }
    void buildNext(string& s, vector<int>& next, int n)
    {
        int k = -1;
        int j = 0;
        next[0] = -1;
        while(j < n)
        {
            if(k == -1 || s[j] == s[k])
            {
                k ++;
                j ++;
                next[j] = k;
            }
            else
            {
                k = next[k];
            }
        }
    }
};