Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
参考:
http://blog.csdn.net/hopeztm/article/details/7932245
http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
class Solution {
public:
string longestPalindrome(string s) {
string newStr = preProcess(s);
int len = newStr.length();
int *p = new int[len];
int C = 0, R = 0;
for (int i = 1; i < len - 1; ++i) {
int mirror = C * 2 - i;
p[i] = R > i ? min(R - i, p[mirror]) : 0;
while (newStr[i + p[i] + 1] == newStr[i - p[i] - 1]) {
++p[i];
}
if (i + p[i] > R) {
C = i;
R = i + p[i];
}
}
int mid = 0, maxLen = 0;
for (int i = 1; i < len - 1; ++i) {
if (p[i] > maxLen) {
maxLen = p[i];
mid = i;
}
}
return s.substr((mid - 1 - maxLen) / 2, maxLen);
}
string preProcess(const string &s) {
int len = s.length();
if (len == 0)
return "^$";
string str = "^";
for (int i = 0; i < len; ++i) {
str += "#" + s.substr(i, 1);
}
str += "#$";
return str;
}
};