214. Shortest Palindrome

using KMP

class Solution {
public:
    string shortestPalindrome(string s) {
        string rev = s;
        reverse(rev.begin(), rev.end());
        string tmp = s + "#" + rev;

        vector<int> next(tmp.size());
        next[0] = -1;
        int k = -1;
        for (int i = 1; i < tmp.size(); i++) {
            while (k >= 0 && tmp[i] != tmp[k + 1])
                k = next[k];
            if (tmp[i] == tmp[k + 1]) k++;
            next[i] = k;
        }

        for (int i = 0; i < tmp.size(); i++) cout<<next[i]<<' ';cout<<endl;
        return rev.substr(0, s.size() - 1 - next[tmp.size() - 1]) + s;
    }
};

O(n^2)

class Solution {
public:
    string shortestPalindrome(string s) {
        string rev = s;
        reverse(rev.begin(), rev.end());
        string pre = "", suf = "";
        int overlap = 0;
        if (rev == s) return s;
        for (int i = 0; i < s.size(); i++) {
            pre += s[i];
            suf = rev[s.size() - i - 1] + suf;
            if (pre == suf) overlap = i;
        }
        return rev.substr(0, s.size() - overlap - 1) + s;
    }
};

results matching ""

    No results matching ""