leetcode:Shortest Palindrome

来源:互联网 发布:食品的分销网络 编辑:程序博客网 时间:2024/05/17 22:24

Shortest Palindrome
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

For example:

Given “aacecaaa”, return “aaacecaaa”.

Given “abcd”, return “dcbabcd”.
分析
We can construct the following string and run KMP algorithm on it: ST=(s) + (some symbol not present in s) + (reversed string).then we caculate next[j] value of ST.
时间复杂度O(n),空间复杂度O(n)。

class Solution {public:    string shortestPalindrome(string s) {        string tmp=s;        int size = s.size();        reverse(tmp.begin(), tmp.end());        tmp = s + "#" + tmp;        vector<int> next(tmp.size()+1, 0);        KPM_nextJ(tmp, next);        return tmp.substr(size + 1, size - next[tmp.size()]) + s;    }    void KPM_nextJ(const string& str, vector<int>& next){        int j = 1, k = 0;        next[0] = -1;        next[1] = 0;        int size = str.size();        while (j < size){            if (str[j] == str[k]){                ++k;                ++j;                next[j] = k;            }            else if (k == 0){                ++j;                next[j] = 0;            }            else                k = next[k];        }    }};
0 0
原创粉丝点击