http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() <= 1) {
return s;
}
string str("$");
for(int i = 0; i < s.size(); i++) {
str += "#" + s.substr(i, 1);
}
str += "#";
vector<int> handle(str.size(), 0);
int index = 0, border = 0;
for(int i = 1; i < str.size(); i++) {
if(i < border) {
int j = index - (i - index);
handle[i] = min(handle[j], border - i);
} else {
handle[i] = 0;
}
while(str[i + handle[i] + 1] == str[i - handle[i] - 1]) {
handle[i]++;
}
if(border < i + handle[i]) {
index = i;
border = i + handle[i];
}
}
int max_index = 0, max_length = 0;
for(int i = 1; i < str.size(); i++) {
if(max_length < handle[i]) {
max_index = i;
max_length = handle[i];
}
}
int start_index = max_index - max_length;
return s.substr(start_index - (start_index + 1) / 2, max_length);
}
};