1.Manacher算法

一个串中,找到最长的回文子串。

1.1 暴力解决

得解决长度为奇数的回文和长度为偶数的回文。

1.1.1 奇回文

  • i位置自己肯定构成回文;长度为1
  • i+1位置和i-1位置相不相等?相等,构成回文。长度为3
  • i+2位置和i-2位置相不相等?相等,构成回文。长度为5

1.1.2 偶回文

1.1.1 中的方法不适用

1.1.3 解决方法

向字符串的开头、中间和结尾加东西。

既有奇回文:11311

又有偶回文:11

处理:

然后计算每一位的回文长度:

最终结果是:11/2=5

此方法适用于奇回文和偶回文。

添加的字符无论啥都可以。因为添加的字符不会和原字符串中的字符进行比较,只是和添加的字符比较(实轴永远和实轴比较,虚轴和虚轴比较)。

时间复杂度:

2.概念

2.1 回文直径

回文半径

在Manacher算法中,需要准备一个数组——回文半径数组。存以每个位置为中心的情况下,可括出来的回文半径的长度。

加速:数组后面的位置的值能否利用前面的值,减少计算,实现加速。

2.2 最右回文右边界

所有回文半径中最靠右的位置。

初始:R在-1的位置;

0位置:只能扩到自己;

1位置:可以扩到2位置(#1#)

2位置:不行

3位置:可扩到6位置(#1#2#1#)

表示的是:每个位置下,R最右能到的位置。

3右边扩到了最右的0位置。

2.3 回文右边界的中心

C表示:第一次取得这个最右边界的中心位置。

0位置时,它的C是3.

3的右边界到它右边的1,后面的2的右边界也是2后面的1,但是1的C=3的位置(记录的是第一次到达的)。

3.分情况讨论

3.1 i位置不在回文右边界中——

比如刚开始的时候,R在-1位置,i在1位置。就是i不在回文右边界。

则暴力扩。

时间复杂度:R的变化范围是从0~N,所有扩的范围都在推后R,而且不会回退,所以总的时间复杂度是

3.2 i位置在回文右边界的里面

位置1的回文右边界在2位置,当i为2时,它在回文右边界的里面。

3.2.1 i'的回文半径在L里面——

由C和R得到回文左边界L,假设此时i的位置如图所示:

C肯定在i的左边。关于C做i的对称点i':

由回文数组中i'的回文半径,可得到一下多个可能性:

可能性1:i'的回文区域在L和C的中间

举例:

C:在F的位置

F的R和L在K位置

i'和i在b的位置

i'为重新的回文是aba,完全在L和C中间。

结论:i位置的回文半径和i'的相等

证明:

  1. 小R'到小L'之间肯定是回文结构
  2. 且这个范围不会扩的更大。

3.2.2 L和R没包住小L和小R——

举例:

此时i的回文半径就是i到R。

证明:

过程:

3.2.3 L压线

举例:

这种i的回文半径能不能扩的更大需要尝试。上例中,由于k=k,所以可以扩。

如下图,k≠s,不可以扩

时间复杂度同3.1:

4.应用

给定一个字符串,要求只能在串后面添加字符,使之成为一个回文串。要求添加的字符数最少。

比如,给定:

添加cba会使上串变为回文串,且最短。

它就是在求必须包含最后一个字符("1")的情况下,最长回文串是多少。前面不是的部分(“abc”)逆序过来,就是答案。

改写Manacher:

  • 一直求每个位置的回文半径。
  • 当R到达最后一个位置的时候,停。得到回文半径到R的位置C。此时有R和C。
  • 然后将R以C为中心,对称到R’。即得包含最后一个位置的最长回文串。
  • 然后将前面剩余部分逆序,添加到给定字符串的后面。

比如:

算法练习day18——190409(Manacher)相关推荐

  1. 牛客练习赛 57——manacher算法 树形dp?

    A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragm ...

  2. Manacher算法图解

    看了好久的Manacher算法,觉得还是要自己画一遍,自己把代码写一遍才能理解 下面分享一下,如果有错,希望指正 简陋版本的,但是他基本只是做到了求取最长回文字符串,严格来说它并不是Manacher' ...

  3. 马拉车(manacher)算法——最长回文(hdu3068)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目描述: Problem Description 给出一个只由小写英文字符a,b,c...y ...

  4. 最长回文子串——Manacher 算法​​​​​​​

    0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字符串正着读和反着读是一样的,那它就是回文串.下面是一些回文串的实例: 12321 a aba abba aaaa ...

  5. Manacher算法及其扩展

    文章目录 回文字符串: 最长回文字符串问题 有啥用? 暴力解最长回文问题( O ( N 2 ) O(N^2) O(N2)) Manacher算法O(N) 存储的信息 几种情况 代码 回文字符串: 正着 ...

  6. 【最长回文子串】Manacher算法详解

    写在前面 manacher算法解决最长回文子串以及变形问题的时间复杂度为O(n). 如果你想囫囵吞枣,只需要使用到该算法,你可以直接把代码拿走:但如果你想深入了解这个算法的工作原理和关键部分解读,还是 ...

  7. manacher 算法 java,Manacher算法的详细讲解

    Manacher算法,又叫"马拉车"算法,可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度的问题. 一.回文子串的一般解法 比较简单的思路是将字符串的每一个字符作 ...

  8. KMP、扩展KMP、MANACHER

    一.KMP 作用:用于在一个文本串S内查找一个模式串P出现的位置 string str = "bacbababadababacambabacaddababacasdsd"; str ...

  9. manacher介绍及图文讲解(用于求解最长回文子串)

    manacher算法是一种可以在O(N)时间复杂度下求字符串所有回文子串的算法,也是求最大回文子串最高效的算法.这种算法在进行遍历的时候,充分利用了回文串的特性,减少了许多不必要的计算,使得时间复杂度 ...

最新文章

  1. Matlab数据的可视化 -- 条形图
  2. 基于卷积神经网络(CNN)的仙人掌图像分类
  3. STL——内存基本处理工具
  4. CCS卸载安装过程及所遇问题
  5. UA MATH566 例题 Poisson回归、Overdispersion与负二项回归
  6. 恩施茶旅谋定乡村-农业大健康·万祥军:侗乡第一寨促生态
  7. 基于php响应式网站毕业论文,基于html5与css3的响应式web页面设计与实现.docx
  8. 【附段错误原因,最后两个测试点】1052 Linked List Sorting (25 分)【链表类题目总结】
  9. IOS开发基础之socket的使用
  10. 力扣20-有效的括号(C++,附思路)
  11. idea下如何正确导入多个module
  12. Oracle技巧集锦
  13. c语言程序设计备考,《C语言程序设计》复习资料.doc
  14. React-Native 爬坑爬坑
  15. 图像变换中的常用插值方法(含公式推导)
  16. 基于阿里开源的COLA架构和DDD领域驱动设计构建货物运输系统
  17. 虚拟服务器防病毒,windows 2008 Hyper-v虚拟化防病毒
  18. 如何注册earthdata账号
  19. 04、【电脑维修】Win 10重新安装微软商店以及便筏打不开问题
  20. oracle 导出数据库和导入数据库

热门文章

  1. 流量银行与阿里联手放大招 1毛钱换1块钱
  2. 连遭主流社交应用抛弃,是时候宣判黑莓系统死刑了
  3. [控件] TranformFadeView
  4. 转:使用curl来调试你的应用
  5. FPGA学习及设计中的注意事项
  6. CA自签证书的颁发及应用
  7. 为何出现Error Loading Midas.dll消息?
  8. 大学生html5设计大赛方案,2018年大学生三维设计大赛策划书范文
  9. Ubuntu 安装 QQ
  10. 详细分析JVM内存模型