【Algorithm】Manacher's Algorithm

Manacher‘s Algorithm 马拉车算法 Manacher's Algorithm,俗称马拉车算法,是一种用于查找一个字符串中最长回文子串的线性时间复杂度算法,由Manacher在1975年发明。该算法的主要贡献在于将查找最长回文子串的时间复杂度降低到了O(n)。 阅读详情

        Manacher‘s Algorithm,O(n)时间找出最长回文子串。

        我们将以此字符串作为例子讲解 

ABABBDDABBBBDD。

Manacher's Alogorithm第一步是将其作以下扩展:

$ # A # B # A # B # B # D # D # A # B # B # B # B # D # D # & 

其中尾字符用于告知已到字符串尾。

我们首先对上述字符串人工求出最长回文串,我们只计算包括自身向右扩展的部分,结果如下:

$  #  A  #  B  #  A  #  B  #  B  #  D  #  D  #  &                 step 1

    1  2  1   4  1  2  1  2   3  2  1  2  3   2  1 

        Manacher's Algorithm 首先通过step 1将上述字符串进行扩展,并用一个数组p,来保存上面我们口算的最长回文子串。

问题是,如何计算 p[i] 呢?

        首先,该算法借助2个辅助变量,分别为mx和id, 用来表示当前求得的最长的回文子串的最右边界及当前最长回文子串的中心点。即有关系以下公式:  mx = id + p[id]。 即当前最长回文子串的中心点为id,向右扩展p[id]即可到达边界mx。


1. 当 i < mx 时, 有p[i] >= min(p[ 2 * id - i], mx - i)。 这里的2 * id - i 即为上图的 j ,为 i 关于id的对称点。为什么呢?

  • 首先,显然,由于最长回文子串是以id为中心,长度为从中心向右扩展到mx的序列暂且称为pstr。
  • 如果以 j 为中心的回文子串包含在pstr中,那么显然由于 i 是 j 关于id的对称点,那么此时肯定有p[i] >= p[j]。其实只能是p[i] = p[j]。这也就是上图的情况,i和j的小下划线分别说明包含在pstr中的小回文串。
  • 如果pstr不能完全包含以 j 为中心的回文串呢? 因为此时 i 还不知道从mx 开始扩展的情况,但是由于堆成,肯定以 i 为中心的回文串的p[i]肯定大于等于 mx - i。也就是如下图的情况,绿色框框表示 i 至少当前这段是回文串。

2. 当 i 大于mx 时,由于没有先验知识,所以此时p[i]只能为1。 注意,这里i之前的p[x] 都是已知的。我们是要求i和 i 之后的p[x]。



class Solution {
private:
    string preprocess(const string& s) {
        string res = "$#";
        for(int i = 0; i < s.size(); ++ i) {
            res += s[i];
            res += '#';
        }
        res += '^';
        return res;
    }

public:
    string longestPalindrome(string s) {
        const int len = s.size();
        if(len <= 1) return s;
        
        // 获得举例的string
        string str = preprocess(s);
        
        // Manncher algorithm, O(n)
        int id = 0, mx = 0;
        int sz = str.size();
        // 用于保存p[x]
        vector<int> p(sz, 0);
        for(int i = 1; i < sz - 1; ++ i) {
            // 关键在这里
            p[i] = mx > i ? min(p[2*id-i], mx - i) : 1;
            // 首先肯定的是p[i]内一定是字符串,那么还是需要继续扩展的
            // 直到扩展到不满足的情况。
            while(str[i + p[i]] == str[i - p[i]]) p[i] ++;
            // 更新 mx 和 id
            if(i + p[i] > mx) {
                mx = i + p[i];
                id = i;
            }
        }
        
        // 求出最大的id 和 mx
        int maxLen = 0, idx = 0;
        for(int i = 1; i < sz - 1; ++ i) {
            if(p[i] > maxLen) {
                maxLen = p[i];
                idx = i;
            }
        }
        return s.substr((idx - maxLen) / 2, maxLen - 1);
    }
};


参考:

JustDoIt 博客, http://www.cnblogs.com/TenosDoIt/p/3675788.html



利用eds editor生成CANOPEN 设备eds文件 通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。 阅读详情

相关推荐

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。

weixin_42525551的博客 1084

Manacher’s Algorithm超详细!!!

0x00 问题描述 给定一个字符串,找到最长的回文子串。 如果给定的字符串是“forgeeksskeegfor”,则输出应为“geeksskeeg” 如果给定的字符串是“abaaba”,则输出应为“abaaba” 如果给定的字符串是“abababa”,则输出应为“abababa” 如果给定的字符串是“abcbabcbabcba”,则输出应为“abcbabcba” 0x01 常见解法 寻找回文的...

coordinate的博客 7586

具身智能与空天具身智能:从理论到实践的跨领域融合

本文深入探讨了具身智能从理论到实践的发展,重点分析了空天具身智能这一前沿领域。文章阐述了如何为AI赋予“身体”,使其通过与环境实时交互进化智能,并详细拆解了构建空天智能体所需的核心技术模块,包括多模态感知、基于大模型的决策规划以及鲁棒控制。同时,结合山区电力线自主巡检等实战案例,展望了多智能体协同与标准化等未来方向。

weixin_29045585的博客 532

【算法】——Manacher Algorithm(马拉车算法)

一、马拉车算法来源 马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。对于回文串想必大家都不陌生,就是正读反读都一样的字符串,比如 "bob", "level", "noon" 等等,那么如何在一个字符串中找出最长回文子...

汤庆 8403

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5727

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

马拉车算法(Manacher‘s Algorithm)

马拉车算法 算法定义: Manachar算法主要是处理字符串中关于回文串的问题的,它的强大之处在于,可以在O(n)的时间复杂度中解决回文串的问题。 主要参考: 马拉车算法 算法思想: 解决回文串的奇偶性的问题 主要办法:在每个字符间插入"#",并且为了使得扩展的过程中,到边界后自动结束,在两端分别插入 “^” 和 “$” ...

无 1066

从选型到阵列:基于ESP32-S3的智能硬件麦克风系统设计实战

本文详细介绍了基于ESP32-S3芯片设计智能硬件麦克风阵列的完整实战方案。从核心芯片选型、数字MEMS麦克风的参数解读与电路设计,到关键的声学结构密封、阵列布局策略,再到利用ESP-ADF框架构建音频处理流水线并集成回声消除、噪声抑制等算法,提供了从硬件到软件的全链路设计指南与避坑要点,旨在实现清晰、稳定的远场语音交互。

weixin_29173777的博客 265

manacher(图文详解)

主要介绍了马拉车算法的原理。

Shun_Hua的博客 1025

【AI应用实战-Codex】Mac intel芯片下安装Codex(二)

摘要:本文介绍了在Intel芯片Mac上安装OpenAI Codex桌面应用时遇到的问题及解决方法。由于官方仅提供ARM64版本,导致Intel Mac无法直接运行。解决方案包括:1)使用社区脚本将ARM版DMG与x64 Electron重新打包成兼容版本;2)使用VSCode插件配合CLI作为替代方案。文章详细记录了重新打包过程中遇到的"electron_common_owl_features"绑定缺失错误,通过注入stub代码、重算ASAR完整性哈希等步骤成功解决问题。最终生成的Co

3511

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2885

[杂谈] 11. Manacher's Algorithm 马拉车算法

1. 算法由来 马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。 对于回文串想必大家都不陌生,就是正读反读都一样的字符串,比如 “bob”, “level”, “noon” 等等,那么如何在一个字符串中找出最长回文子串呢,可...

Y-puyu 的博客 1621

点云语义分割:PointNet训练S3DIS数据集

文章目录一、数据准备1.1、数据下载二、训练三、测试 项目地址:pointnet 此次我们是用pointnet网络来做语义分割。代码在pointnet项目中的sem_seg文件夹下,里面也有README.md介绍了训练的过程。 一、数据准备 1.1、数据下载 原始数据下载 处理好的h5格式数据下载 二、训练 三、测试 ...

zhaoguanhua的博客 4176

Manacher's Algorithm 马拉车算法

本文是对博主Grandyang和BIT祝威,以及王大咩的图书馆关于最长回文子串使用马拉车算法求解的整理,若是对我的整理有所不懂,可移步三位的博客。 这个马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。对于回文串想必大家都不...

Night___Raid的博客 261

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

马拉车算法(Manacher's Algorithm)

马拉车算法 这个马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。对于回文串想必大家都不陌生,就是正读反读都一样的字符串,比如 “bob”, “level”, “noon” 等等,那么如何在一个字符串中找出最长回文子串呢,可以...

qq_36134437的博客 442

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Manacher's Algorithm

Manacher's algorithm

yd-li的专栏 459

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Manacher's algorithm

Longest Palindromic Substring Part IINovember 20, 2011 by 1337c0d3r  158 RepliesGiven a string S, find the longest palindromic substring in S.Note:This is Part II of the article: Longest Palindromic S...

lifeqiuzhi521的博客 398

Manacher's Algorithm 马拉车算法(C++)

Manacher’s Algorithm 马拉车算法 什么鬼名字? 参考以下链接,把java代码用c++写了一遍 最长回文字符串算法-Manacher’s Algorithm-马拉车算法 算法介绍 这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这...

CWZgxu 1044
上一篇: 【STL】SGI空间配置器 Allocator
下一篇: 个人博客开用啦
小do在努力
博客等级 码龄16年 58粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值