Manacher’s algorithm
LeetCode上一道求回文字符串的问题,通常容易想到的是暴力和动态规划的方法,时间复杂度为O(n^2),后来看到有一种更巧妙的算法,Manacher’s algorithm,时间复杂度为O(n)。参考大神的博客,记下来自己的理解,方便日后查阅。
1.预处理
首先,由于通常情况下,对于奇数长度和偶数长度的不同字符串,我们需要分别处理。这里,通过巧妙的预处理,在每一个字符两边增加一个特殊字符,例如:#a#b#a#a#b#a#a#b#,这样就可以枚举到每一个中心了,就是说把两种情况都统一起来。算法的思想是利用前面已经求得的回文子串的信息,来求以当前字符中心的回文子串。
2.空间换时间
然后,我们需要用一个数组 P[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i]),比如S和P的对应关系:
S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 #
P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1
(p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度)
那么怎么计算P[i]呢?该算法增加两个辅助变量(其实一个就够了,两个更清晰)id和mx,
其中id表示最大回文子串中心的位置,mx则为id+P[id],也就是最大回文子串的边界。
注意:在算法中,id和mx是一直更新的,其表示,以id为起点,半径为mx势力范围内能够罩住的区间,即[id - mx,id + mx]。
3.算法逻辑分析
假设现在我们要求P[i],i关于id的对称点j是否有信息可以利用呢?主要看id为中心的回文串半径与P[j]的关系
总的来说,有三种情况
a.完全覆盖,不包括边界
此时可以完全利用i的对称点j的已有信息,即P[i]=P[j];此时,不会更新id和mx值,即可以直接处理下一个字符。
b.恰好覆盖,到达边界
此时,就需要就在边界的下一个开始继续比较下去
c.未能覆盖
此时,p[i] = mx - i 且 不会更新id和mx值,即可以直接处理下一个字符。
那么P[i]=j+P[j]-i ;因为如下图,1、13不在pj里面,就是说s[1]!=s[13],而在p4里面有s[1]=s[7],所以s[13]!=s[7],所以不能形成更长的回文串。
参考资料:
1.http://blog.csdn.net/insistgogo/article/details/12287805
2.http://sleeping1346.blog.163.com/blog/static/1746069002013622115614829/
Manacher’s algorithm相关推荐
- Manacher's Algorithm 马拉车算法(最长回文串)
这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- Manacher's ALGORITHM
文章转载于Felix's Blog,在此谢过,便于理解,文章有稍微改动. Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 首先用一个非常巧妙的方式对子串预处理: (1) ...
- Manacher's Algorithm 马拉车算法
转自:https://www.cnblogs.com/grandyang/p/4475985.html 这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方 ...
- Manacher's algorithm: 最长回文子串算法
Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...
- Manacher’s Algorithm超详细!!!
0x00 问题描述 给定一个字符串,找到最长的回文子串. 如果给定的字符串是"forgeeksskeegfor",则输出应为"geeksskeeg" 如果给定的 ...
- Manacher Algorithm马拉车算法详解
Manacher Algorithm马拉车算法详解 链接:https://www.zhihu.com/question/37289584/answer/465656849 中心扩展算法 我们先来看一个 ...
- Manacher's algorithms(马拉车算法)最长回文子串
最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...
- 最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)
马拉车算法 Manacher's Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了 ...
- 傻子都能看懂的马拉车Manacher
Manacher's Algorithm 马拉车算法操作及原理 package advanced_001;public class Code_Manacher {public static char[ ...
最新文章
- 鸿蒙铝模脱模剂,铝模采用这项技术,前3层不需再涂油性脱模剂,将成铝模出厂标配...
- 基于JSP/SERVLET学生管理系统
- python生成的词云没有图案_Python生成词云的实现代码
- 根据父类id查询所有的父级_031、组函数和子查询
- JAVA入门级教学之(方法-6)
- 将xscj指定为当前数据库_通过网络连接数据库模式Hive的搭建过程详解
- CentOS6.5下安装iRedMail中需要解决的问题
- Python对文本文件的简单操作(一)
- [JavaScript]Call和Apply方法
- MyBatis中Mapper映射文件的输入(parameterType)和输出(resultType)映射
- mix2线刷开发板救砖_小米MIX2原版固件刷机包下载_小米MIX2线刷官方系统升级包...
- 微机原理与接口技术-第二版-课后习题答案 绪论
- 计算机上word如何批量打印,word批量调页面设置 关于Word如何批量打印
- 让ImageMagick支持png和jpeg格式
- broker可以禁用吗 time_【pximouse可以禁用吗】pximouse是什么程序_pximouse是什么
- android webview 跳转系统浏览器,webview 调用系统浏览器怎么解决
- 计算机网络个人简历范文,计算机网络个人简历范文
- android ppt 注释软件,安卓版WPS Office 5.5.2增强PPT悬浮备注框
- java测试单个方法 @Test
- 水准助手V2.0软件使用说明
热门文章
- 数据库常用的三个存储引擎
- Codeforces Round #483 (Div. 2)题解
- 荣耀30公测鸿蒙,先别骂!荣耀30 Pro鸿蒙内测截图曝光,三大机型将于下个月推送...
- 支付宝集五福最全攻略!「一行黑科技」
- oracle 登录rman,rman target / 登录不进去
- PA 2.0 中的动态类型安全查询
- 如今国产手机都是玻璃机身,金属机身不好吗?你知道原因吗
- [ZT]自己制作U盘版的《电脑公司特别版》
- python数组显示全部元素
- 田忌赛马贪心算法_田忌赛马问题——贪心算法