首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Leetcode】5.最长回文子串(Manacher算法)

【Leetcode】5.最长回文子串(Manacher算法)

作者头像
FishWang
发布2025-08-27 13:12:00
发布2025-08-27 13:12:00
1070
举报

题目链接

点击打开题目

题目描述

在这里插入图片描述
在这里插入图片描述

题解

这题二刷的时候又忘了怎么做了,实在是不应该,以后还得用博客记一下。

常规做法就是以每个字母为中心,向两个方向搜索结果,时间复杂度为

O(n^2)

。而Manacher(马拉车?)算法是一个高效且巧妙的

O(n)

算法。

算法核心思想

因为是回文串,所以串的对称位置上的字符可以共用一些信息。

例如:abaeaba是以e为中心的回文串,可以看到左边的b最长的回文串长度为3(aba),那么右边的长度也就至少为3(这一点要注意,是至少为3,但有可能更长,假如字符串的最后再加个e就更长了)。

算法步骤
  1. 预处理字符串: 把字符串每个字符中间都插入一个符号,并且在开头和结尾的位置也插入两个不同的符号。这样的目的是避免偶数长度的回文串在计算中造成麻烦。 例如:babad -> ^#b#a#b#a#d#$ 其中插入的符号可以自己改变。
  2. 从左至右依次处理每个字符的结果。
  3. 对于每个字符,先判断它是否位于某个回文串内,如果是的话,那么以它为中心的串的长度至少为对称位置上的长度;否则,就只能依次搜索。 在搜索的过程中要记录当前发现的最长串的位置(中心点和右端点),这样才能知道当前字符是不是位于某个串内。

代码

代码语言:javascript
复制
/*
 * @lc app=leetcode.cn id=5 lang=cpp
 *
 * [5] 最长回文子串
 */
class Solution {
public:
    string longestPalindrome(string s) {
        string str = processString(s);
        int ans=0;  // 结果串的长度
        int ans_pos=0;  // 结果串的中心
        int id=0;  // 搜索最远回文串的中心
        int mx=0;
        vector<int> p(str.size(), 0);
        for (int i=1; i<str.size()-1; i++)
        {
            // 如果前面已经扫描到过这个位置,可以直接和对称位置比较
            p[i] = mx > i ? min(p[2*id-i], mx-i) : 1;

            // 不管用不用搜索,都试一下,和用if判断效果一样
            while (str[i+p[i]] == str[i-p[i]])
                p[i]++;
            
            // 更新一下扫描的最远位置
            if (i+p[i] > mx)
            {
                mx = i+p[i];
                id = i;
            }

            // 更新结果
            if (p[i] > ans)
            {
                ans = p[i];
                // 中心位置
                ans_pos = i;
            }
        }
        return s.substr((ans_pos-ans)/2, ans-1);
    }
    string processString(const string &s)
    {
        string str = "^#";
        for(int i=0; i<s.size(); i++)
        {
            str += s[i];
            str += "#";
        }
        str += "$";
        return str;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目链接
  • 题目描述
  • 题解
    • 算法核心思想
    • 算法步骤
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档