5. Longest Palindromic Substring
Description
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
Solution
Solution1:遍历整个字符串,把每一个字符当成中心向两边拓展,找到最长回文串。
Solution2:Manacher算法,具体可以参考[译+改]最长回文子串(Longest Palindromic Substring)
Complexity analysis
Manacher算法,O(n)
Code
class Solution {
public:
string longestPalindrome(string s) {
string temp = "^#";
for (int i = 0; i < s.length(); i++) {
temp += s[i];
temp += "#";
}
temp += "&";
int length = temp.length();
int id = 0;
int R = 0;
int arr[length];
for (int i = 1; i < length - 1; i++) {
int li = id - (i - id);
int diff = R - i;
if (diff >= 0) {
if (arr[li] < diff) {
arr[i] = arr[li];
} else {
arr[i] = diff;
while(temp[i+arr[i] + 1] == temp[i - arr[i] - 1]) {
arr[i]++;
}
id = i;
R = i+arr[i];
}
} else {
arr[i] = 0;
while(temp[i+arr[i] + 1] == temp[i - arr[i] - 1]) {
arr[i]++;
}
id = i;
R = i+arr[i];
}
}
int max = 0;
int center = 0;
for (int i = 1; i < length-1; i++) {
if (arr[i] > max) {
max = arr[i];
center = i;
}
}
return s.substr((center-max)/2, max);
}
};