leetcode5 longest palindrome substring 之manacher算法

这个题的常规解法大家可以看答案,还是很简单直接的。这里我想用自己比较易懂的语言,讲一下可以达到o(n)的manacher算法,希望可以帮助有兴趣的盆友思考。

首先要引入臂长的概念,比如abcba,以c为中心,那么臂长是2。

接下来我们考虑,关于某中心回文上对称的两个点,比如上面abcba上的两个b点,应该有对称的效果。(它俩所在的回文就叫原始回文吧。)
在这里插入图片描述
左点的臂长如果是不超过原来回文的臂展的,也就是是个小回文,那右点应该至少也拥有这个小回文的臂长。(图片上面的回文,绿点应该至少有红点同样的小臂长)

那么,如果左点的臂长比较大,超过了原始回文臂展范围呢?右点是否还回和左点臂长一样?答案就是不一定了。(图片下面的回文,当红点的范围超过了原始回文,绿点可以拥有这样的大臂长嘛?答案是否定的。)

因为,红绿两点的对称性,只在原始回文范围内有效,一旦超过了原始回文的范围,超出的点是否等于红点对称的点,我们没比过没数据不知道,要亲自比一比才行。所以答案是不知道。万幸的是,红绿两点的黄色部分是一样的回文,那么红点臂长至少有黄回文那么长。

这两种case综合一下,用计算机的语言写出来,就是红点臂长我们可以肯定至少有,min(绿点臂长, 黄回文臂长)这么长。

这个策略就让我们面对一个新的回文中心时,可以不用从1来++实验臂长,而是把它看作右边的绿点,找到对应的红点,站在过去data的肩膀上,从上面提到的min(绿回文臂长,黄回文臂长)这样作为起点,继续两边看👀。

那么原始回文中心挑哪个好呢?首先,红点肯定必须落在原始回文内。其次,原始回文的右至也是超过红点越远越好。即黄回文越长越好。(如果红回文超过黄回文的界,黄部分越大越好;当红回文较小,红点的取法不影响正确性。百利而无一害。)

那怎么找到这个右至最右的回文呢?我们可以专门keep一个中点和臂长,代表右至最右回文。每次有新中心和新回文,都看看它的右至最右,适时更新。

于是我们讲清楚了奇数长度回文的情况。关于偶数回文,我们下回分解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值