LeetCode回文序列判断总结
5. Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example 2:
Input: “cbbd”
Output: “bb”
- 方法1:已每一个字符的中心,向两侧扩散,判断是否是回文序列,时间复杂度为O(n)。需要注意回文序列是奇数和偶数两种情况。
//写法1
public:
string longestPalindrome(string s) {
if(s.size() < 2)
return s;
int n = s.size(),start=0, maxLen=0;
for(int i=0; i<n-1; i++){
searchPalindrome(s,i,i,start,maxLen);
searchPalindrome(s,i,i+1,start,maxLen);
}
return s.substr(start,maxLen);
}
private:
void searchPalindrome(string s, int left, int right, int &start, int &maxLen){
while(left>=0 && right<s.size() && s[left]==s[right] ){
++right;
--left;
}
if(maxLen < right-left-1){
start = left+1;
maxLen = right-left-1;
}
}
//写法2
public:
string longestPalindrome(string s){
if(s.size()<2)
return s;
int n=s.size(),start=0,maxLen=0;
for(int i=0; i<n; i++){
if(n-i <= maxLen/2)
break;
int left=i,right=i;
while(right<n-1 && s[right+1]==s[right] ){
++right;
}
while(left>=0 && right<n && s[left]==s[right]){
++right;
--left;
}
if(maxLen < right-left-1){
start = left+1;
maxLen = right - left -1;
}
}
return s.substr(start,maxLen);
}
- 方法2:Manacher’s Algorithm 马拉车算法
参见:马拉车算法
public:
string longestPalindrome(string s) {
string t ="$#";
for (int i = 0; i < s.size(); ++i) {
t += s[i];
t += '#';
}
int p[t.size()] = {0}, id = 0, mx = 0, resId = 0, resMx = 0;
for (int i = 0; i < t.size(); ++i) {
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
while (t[i + p[i]] == t[i - p[i]]) ++p[i];
if (mx < i + p[i]) {
mx = i + p[i];
id = i;
}
if (resMx < p[i]) {
resMx = p[i];
resId = i;
}
}
return s.substr((resId - resMx) / 2, resMx - 1);
}