leetcode 5 Longest Palindromic Substring

Posted by lsq on November 5, 2018

题干

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 73.89%

class Solution {
public:
    void isPalindromic(string &s, int left, int right, int &start, int &maxlen)
    {
        while(left >= 0 && right < s.size() && s[left] == s[right]){
            left--; right++;
        }
        if(right - left - 1 > maxlen){
            start = left + 1;
            maxlen = right - left - 1;
        }
    }
    
    string longestPalindrome(string s) {
        if(s.size() < 2) return s;
        int len = s.size(), maxlen = 0, start = 0;
        for(int i=0; i < len; i++)
        {
            isPalindromic(s, i, i, start, maxlen);
            isPalindromic(s, i, i+1, start, maxlen);
        }
        return s.substr(start, maxlen);
    }
};

题解2 99.65% Manacher算法

class Solution {
public:    
    string longestPalindrome(string s) {
        string t = "$#";
        for(int i=0; i<s.size(); i++)
        {
            t += s[i];
            t += "#";
        }
        vector<int> p(t.size(), 0);
        int mx = 0, id = 0, resLen = 0, resCenter = 0;
        for(int i = 1; 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(resLen < p[i]){
              resLen = p[i];
                resCenter = i;  
            } 
        }
        return s.substr((resCenter - resLen) / 2 ,resLen - 1);
    }
};

参考