c_cpp 5.最长的回文子串 - Med - 2018.10.15

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 5.最长的回文子串 - 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;
    }
};

以上是关于c_cpp 5.最长的回文子串 - Med - 2018.10.15的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 最长回文子串的.cpp

leetcode-5 最长回文子串(动态规划)

Leetcode 5. 最长回文子串

5. 最长回文子串

5-最长回文子串

[5]. 最长回文子串