cbangchen
11/11/2018 - 7:39 AM

5. Longest Palindromic Substring - Med - 2018.10.15

class Solution {
public:
    string longestPalindrome(string s) {
        if (s.length() <= 1) {
            return s;
        }
        
        // 处理边界条件字符'$','+'和'#'字符
        vector<char> chars;
        chars.push_back('$');
        for (auto c : s) {
            chars.push_back('#');
            chars.push_back(c);
        }
        chars.push_back('#');
        chars.push_back('+');
        
        vector<int> nums(chars.size(), 1);
        
        int mid = 0;
        int right = 0;
        int max = 0;
        for (int idx = 0; idx < chars.size()-1; idx++) {
            // right > idx
            if (right > idx) {
                nums[idx] = nums[2*mid-idx] > (right-idx) ? (right-idx) : nums[2*mid-idx];
            }
            
            // 继续进行匹配
            while (chars[idx+nums[idx]] == chars[idx-nums[idx]]) {
                nums[idx] += 1;
            }
            
            // 重置 mid
            if (idx+nums[idx] > right) {
                right = idx+nums[idx];
                mid = idx;
            }
            
            if (nums[idx] > nums[max]) {
                max = idx;
            }
        }
        
        // 组装字符串
        string re;
        for (int idx = max-nums[max]+2; idx < max+nums[max]; idx+=2) {
            re += chars[idx];
        }

        return re;
    }
};