登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Manacher 算法学习笔记 & 详解,一文带你彻底看懂 Manac ...
Manacher 算法学习笔记 & 详解,一文带你彻底看懂 Manacher。
[ 复制链接 ]
凤清昶
昨天 17:40
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
背景
给定一个字符串,请求出它的最大回文子串的长度。
第一种做法是暴力做法,也称中心扩展法。操作逻辑是我们枚举每个可能的对称中点 \(i\) ,以它为中心向两边扩展,并更新答案。显然这个做法是 \(\mathcal O(n^2)\) 的。
第二种做法是二分 + 哈希。通过预处理,我们可以在 \(\mathcal O(1)\) 的时间内比较任意两个子串。又观察到答案具有单调性,我们再二分可能的答案一一验证。显然这个做法是 \(\mathcal O(n\log n)\) 的。
但是,事实上我们有一种极为优秀的算法:Manacher 。这种做法可以做到在 \(O(n)\) 时间内解决上述问题,并且编码压倒性地简单。
预处理
我们知道,回文串有奇偶之分,偶回文串不存在中心点。为了方便,我们采取一种简单的技巧统一这些情况。
具体地说,我们在每两个字符之间,以及原串的首尾分别加入一个不属于原串的字符作为分隔符(如 # )。比如,abba 会变成 #a#b#b#a# 。显然,这并不会影响回文性质。同时,我们还在这个串的首尾额外加入两个不同的特殊字符来标记边界(如 @ 和 $ ),具体作用后文会解释。这样,原串就变成了 @#a#b#b#a#$ 。不难发现,经过这样处理,所有回文串都变成了奇回文串。后文所有讨论都基于奇回文串进行。
算法思路
Manacher 算法应用了回文串的一个重要特性:对称性。
还是需要遍历所有对称中心 \(i\) 。我们定义 \(p_i\) 表示以字符 \(s_i\) 为中心的最长回文子串的半径,\(c\) 表示目前找到的最大回文子串的对称中心,\(r\) 表示目前找到的最大回文子串的右端点。由于我们进行了预处理,所以有 \(ans = \max(p_i-1)\) 。问题是如何快速计算出 \(p_i\) 。
中心扩展法低效的原因是有大量重复的检查。如下图,当我们已经得到了以 \(s_c\) 为中心的回文,即阴影部分,当我们计算它右边的 \(s_i\) 时,完全可以由已经算过的 \(s_j\) 对称得到,即虚线部分。并不需要再算一次。
看起来,我们只需要一点小优化就可以了。但是,实际上并不这么简单。事实上,我们会遇到如下三种情况:
<ol>我们遍历到 \(i\ge r\) ,这时以 \(s_i\) 为中心的回文的镜像并不在记录范围内,其对称性是未知的。这时,我们只好先令 \(p_i=1\),然后使用中心扩展法求 \(p_i\) 。求完后,记得更新 \(r\) 。
我们遍历到 \(ia; s = change(a); cout
Manacher
算法
学习
笔记
amp
相关帖子
AI 学习笔记:Agent 的能力体系
001:LangChain的LCEL语法学习
散点云处理笔记(一):基于主成份分析算法(PCA)的平面拟合
程序员必须知道的核心算法思想
3分钟搞懂深度学习AI:梯度下降:迷雾中的下山路
散点云处理笔记(二):RANSAC算法
3分钟搞懂深度学习AI:反向传播:链式法则的归责游戏
拉格朗日插值算法原理及简单示例
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
AI 学习笔记:Agent 的能力体系
2
69
撇瞥
2026-03-04
安全
001:LangChain的LCEL语法学习
2
207
昝梓菱
2026-03-05
业界
散点云处理笔记(一):基于主成份分析算法(PCA)的平面拟合
1
776
啖曼烟
2026-03-05
业界
程序员必须知道的核心算法思想
0
138
申屠梓彤
2026-03-05
业界
3分钟搞懂深度学习AI:梯度下降:迷雾中的下山路
1
698
电棘缣
2026-03-05
业界
散点云处理笔记(二):RANSAC算法
0
594
姜删懔
2026-03-06
业界
3分钟搞懂深度学习AI:反向传播:链式法则的归责游戏
0
898
卓卞恻
2026-03-06
业界
拉格朗日插值算法原理及简单示例
0
518
盗衍
2026-03-07
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
凤清昶
昨天 17:40
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
宋子
9885
6
韶又彤
9908
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9870
10
遗憩
10006
查看更多
今日好文热榜
238
钉钉文档已正式接入Wan 2.6模型
729
空论惊蛰会神仙
488
IDA-Moles 1.0.7 SDK 接口指南
993
给 OpenClaw 一个灵魂:打造你的赛博妲己
397
Unsortedbin attack与Unlink
228
OpenClaw 快速上手教程:用手机远程指挥电
948
如何学好AI编程?AI提示词框架深度对比分析
518
拉格朗日插值算法原理及简单示例
195
小程序商城平台怎么选?一文看懂呱呱赞、有
652
重磅!腾讯 QQ 官方接入 OpenClaw“小龙虾
713
这才是未来的“openclaw”
941
浙江超翔新能源|售后维修工单数字化管理案
207
Manacher 算法学习笔记 & 详解,一文带你彻
673
2026年高端封边机选型指南及全伺服机型推荐
404
利用SWIG实现JAVA调用C/C++代码
906
4个小白易上手的获客渠道
254
【赵渝强老师】金仓数据库的数据文件
328
[大模型实战 07 额外篇] 从 ReAct 到 Workf
98
Vue 表单避坑:为什么 v-model 绑定对象属
707
读2025世界前沿技术发展报告04人工智能技术