题解 | #最长回文子串#

最长回文子串

http://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

经典马拉车算法,马拉车算法的原理就是利用回文串的镜像对称省去了不必要的比较

class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        // write code here
        int len = 2 * n + 1;
        string b(len,'#');
        if (n < 2) {
            return n;
        }
        for (int i = 0; i < n; i++) {
            b[2 * i + 1] = A[i];
        }
        vector<int>p(2 * n + 1, 0);
        int maxlen = 1;
        int maxRight = 0;
        int center = 0;
        for (int i = 0; i < len; i++) {
            if (i < maxRight) {
                int mirror = 2 * center - i;
                p[i] = min(maxRight - i, p[mirror]);
            }
            int left = i - (1 + p[i]);
            int right = i + (1 + p[i]);
            while (left >= 0&&right<len&&b[right]==b[left])
            {
                p[i]++;
                left--;
                right++;
            }
            if (i + p[i] > maxRight) {
                maxRight = i + p[i];
                center = i;
            }
            if (p[i] > maxlen)
                maxlen = p[i];
        }
        return maxlen;
    }
};
static const auto io_sync_off=[]()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
全部评论

相关推荐

06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务