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相关推荐

  1. Manacher's Algorithm 马拉车算法(最长回文串)

    这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  2. Manacher's ALGORITHM

    文章转载于Felix's Blog,在此谢过,便于理解,文章有稍微改动. Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 首先用一个非常巧妙的方式对子串预处理: (1) ...

  3. Manacher's Algorithm 马拉车算法

    转自:https://www.cnblogs.com/grandyang/p/4475985.html 这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方 ...

  4. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  5. Manacher’s Algorithm超详细!!!

    0x00 问题描述 给定一个字符串,找到最长的回文子串. 如果给定的字符串是"forgeeksskeegfor",则输出应为"geeksskeeg" 如果给定的 ...

  6. Manacher Algorithm马拉车算法详解

    Manacher Algorithm马拉车算法详解 链接:https://www.zhihu.com/question/37289584/answer/465656849 中心扩展算法 我们先来看一个 ...

  7. Manacher's algorithms(马拉车算法)最长回文子串

    最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...

  8. 最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

    马拉车算法 Manacher's Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了 ...

  9. 傻子都能看懂的马拉车Manacher

    Manacher's Algorithm 马拉车算法操作及原理 package advanced_001;public class Code_Manacher {public static char[ ...

最新文章

  1. 鸿蒙铝模脱模剂,铝模采用这项技术,前3层不需再涂油性脱模剂,将成铝模出厂标配...
  2. 基于JSP/SERVLET学生管理系统
  3. python生成的词云没有图案_Python生成词云的实现代码
  4. 根据父类id查询所有的父级_031、组函数和子查询
  5. JAVA入门级教学之(方法-6)
  6. 将xscj指定为当前数据库_通过网络连接数据库模式Hive的搭建过程详解
  7. CentOS6.5下安装iRedMail中需要解决的问题
  8. Python对文本文件的简单操作(一)
  9. [JavaScript]Call和Apply方法
  10. MyBatis中Mapper映射文件的输入(parameterType)和输出(resultType)映射
  11. mix2线刷开发板救砖_小米MIX2原版固件刷机包下载_小米MIX2线刷官方系统升级包...
  12. 微机原理与接口技术-第二版-课后习题答案 绪论
  13. 计算机上word如何批量打印,word批量调页面设置 关于Word如何批量打印
  14. 让ImageMagick支持png和jpeg格式
  15. broker可以禁用吗 time_【pximouse可以禁用吗】pximouse是什么程序_pximouse是什么
  16. android webview 跳转系统浏览器,webview 调用系统浏览器怎么解决
  17. 计算机网络个人简历范文,计算机网络个人简历范文
  18. android ppt 注释软件,安卓版WPS Office 5.5.2增强PPT悬浮备注框
  19. java测试单个方法 @Test
  20. 水准助手V2.0软件使用说明

热门文章

  1. 数据库常用的三个存储引擎
  2. Codeforces Round #483 (Div. 2)题解
  3. 荣耀30公测鸿蒙,先别骂!荣耀30 Pro鸿蒙内测截图曝光,三大机型将于下个月推送...
  4. 支付宝集五福最全攻略!「一行黑科技」
  5. oracle 登录rman,rman target / 登录不进去
  6. PA 2.0 中的动态类型安全查询
  7. 如今国产手机都是玻璃机身,金属机身不好吗?你知道原因吗
  8. [ZT]自己制作U盘版的《电脑公司特别版》
  9. python数组显示全部元素
  10. 田忌赛马贪心算法_田忌赛马问题——贪心算法