马拉车算法详解, C++代码实现

马拉车算法详解, C++代码实现算法介绍马拉车算法是用来在一个字符串中寻找最长回文串 正着读和反着读都相同的字符串 的一种算法 该算法运用了动态规划的思想 将寻找最长回文串算法的时间复杂度降低到了线性 算法原理对于一个字符串要判断它是否为回文串要分为字符串长度为奇数或者偶数两种情况 为了简化做法 我们进行如下的操作 在字符串的两端和每两个字符中间添加一个 或者任意一个一定不会在字符串中出现的字符 通常就是 啦 再在字符串的开始和结尾放置字符串开始和结束的标识符 上述操作后拓展出来的字符串的长度一定是奇数

算法介绍

算法原理

对于一个字符串要判断它是否为回文串要分为字符串长度为奇数或者偶数两种情况,为了简化做法,我们进行如下的操作:

  1. 在字符串的两端和每两个字符中间添加一个 ‘#’ (或者任意一个一定不会在字符串中出现的字符, 通常就是 ‘#’ 啦)
  2. 再在字符串的开始和结尾放置字符串开始和结束的标识符。
    上述操作后拓展出来的字符串的长度一定是奇数。

例如:

abcd 拓展后变为 ^#a#b#c#d#$ abc 拓展后变为 ^#a#b#c#$ 
这里举个例子 s[] = "abac" str[] ^ # a # b # a # c # $ dp[] 1 2 1 4 1 2 1 2 1 
int right; // 在计算过程中用于记录寻找到所有子回文串中右边界的下标 int pos; // 用于记录右边界就是right的子回文串的下标 
 ---------------------------------------------------- ^ ^ ^ |<--------------------|-------------------->| left pos right 

如果 i 在 pos 和 right 之间,则可以寻找 i 关于 pos 的对称点,这时可以先假设dp[i] = dp[2*pos-i],这个假设并不在任何情况下都成立:
如果中心为 2*pos-i 的回文串覆盖的区域左边界超过了left,则这个回文串中存在一些可能不在中心为 i 的回文串中的元素,这种情况下dp[i] = right-i
将上述讨论的情况结合起来即可得到:
dp[i] = min(dp[2*pos-i], right-i)
如果 i > right 那我们就用暴力的方法求解dp[i]即可



算法实现

int Manacher(char* s) { 
    int len = strlen(s+1); char str[2*len+10]; int dp[2*len+10]; int cur = 0; str[0] = '^'; for(int i = 0; i < len; ++i) { 
    str[++cur] = '#'; str[++cur] = s[i]; } str[++cur] = '#', str[++cur] = '$'; int right = 0, pos = 0; for(int i = 1; i <= cur; ++i) { 
    if(i < right) dp[i] = min(dp[2*pos-i], right-i); else dp[right=i] = 1; while(str[i-dp[i]] == str[i+dp[i]]) ++dp[i]; if(i+dp[i] > right) right = i+dp[i], pos = i; } return *max_element(dp+1, dp+cur+1)-1; } 

特别感谢

感谢我女朋友对我的大力支持?。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicatpremium15激活码(JetBrains全家桶)

    (navicatpremium15激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    121
  • 国标 计算机机房,国标相关知识:电子信息系统机房设计规范(GB50174-2008)[通俗易懂]

    国标 计算机机房,国标相关知识:电子信息系统机房设计规范(GB50174-2008)[通俗易懂]1总则1.0.1为规范电子信息系统机房设计,确保电子信息系统安全、稳定、可靠地运行,做到技术先进、经济合理、安全适用、节能环保,制定本规范。1.0.2本规范适用于建筑中新建、改建和扩建的电子信息系统机房的设计。1.0.3电子信息系统机房的设计应遵循近期建设规模与远期发展规划协调一致的原则。1.0.4电子信息系统机房设计除应符合本规范外,尚应符合国家现行有关标准、规范的规定。2术语2.0.1电子信息…

    2022年10月2日
    5
  • kali笔记(八)burpsuite抓包、截包、改包

    kali笔记(八)burpsuite抓包、截包、改包抓包如上篇所说将burpsuite和浏览器都设置好后截包打开截取即interceptison按Forward向前寻找,Drop丢掉你不想要的包,找到你想改的包改包如图我找到我要改的包,并且改掉了它的参数然后关掉,就会发送你改过之后的包然后你的浏览器就将会收到你改过之后的内容在抓过的包中可以看到你改过的包…

    2022年5月27日
    129
  • stm32智能小车设计「建议收藏」

    stm32智能小车设计「建议收藏」提前说说博主是用寄存器写的驱动历时两周,总算把小车弄好了,总体上来说做的太慢了。自己在32的学习中还不够仔细深入,只是浅面的学习,当真正做一个项目时,暴露的问题就太多了。这次在小车的制作的过程中,遇到了各种各样的问题,软件,硬件,各式各样的问题迎面而来,真的好几次心态崩了。不过还好小车这个项目不只是我一个人在搞,组里的其他成员也在一直在考虑问题,想办法,不断地解决解决,总归小车终于做好了,下面…

    2022年10月18日
    5
  • 蓝桥杯真题汇总[通俗易懂]

    第九届A组:1.分数2.星期一​​​​​​3.乘积尾零4.第几个幸运数5.打印图形6.航班时间8.全球变暖9.倍数问题10.​​​​​​​付账问题

    2022年4月18日
    46
  • 【深度学习】5:CNN卷积神经网络原理

    【深度学习】5:CNN卷积神经网络原理前言:先坦白的说,深度神经网络的学习在一开始对我造成的困扰还是很大的,我也是通过不断地看相关的视频资料、文献讲解尝试去理解记忆。毕竟这些内容大多都是不可查的,我们看到的都只是输入输出的东西,里面的内部运作以及工作原理,都需要沉心静思。这篇CNN卷积神经网络的原理介绍,也是自己通过收集来的资料阅读、理解、操练后,有了一定的见解后才拙笔,里面的内容我会尽量详尽,不清楚明白的地方,望大家慧眼指出。–—

    2022年7月20日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号