LeetCode 214. Shortest Palindrome
Solution1:最笨的方法。时间复杂度
O(n2)
O
(
n
2
)
竟然能AC,xixixi
class Solution {
public:
string shortestPalindrome(string s) { //最短的回文串,则对称轴要尽可能往后!
if (s.size() <= 1) return s;
int i = s.size() - 1;
for (; i >= 0; i--) {
if (isPalin(s, 0, i)) break;
}
if (i == s.size() - 1) return s;
else {
string s_copy = s;
string pre = s_copy.substr(i + 1);
reverse(pre.begin(), pre.end());
return pre + s;
}
}
bool isPalin(string &str, int begin, int end) {
while (begin < end) {
if (str[begin] != str[end])
return false;
else {
begin++;end--;
}
}
return true;
}
};
Solution2:
参考网址:http://www.cnblogs.com/grandyang/p/4523624.html
利用KMP算法
参考网址:
[1]http://www.cnblogs.com/grandyang/p/4523624.html
[2]https://blog.youkuaiyun.com/v_july_v/article/details/7041827
class Solution {
public:
string shortestPalindrome(string s) {
string r = s;
reverse(r.begin(), r.end());
string t = s + "#" + r;
vector<int> next(t.size(), 0);
for (int i = 1; i < t.size(); ++i) {
int j = next[i - 1];
while (j > 0 && t[i] != t[j]) j = next[j - 1];
next[i] = (j += t[i] == t[j]);
}
return r.substr(0, s.size() - next.back()) + s;
}
};