Manacher 算法

前言

今天做的是最长回文子字符串的求解,我所用的是遍历查找回文中心点,在通过中心点向两边扩展,这样做的效率比暴力搜索好一点但是复杂度还是o(n^2),答案解析中提到了Manacher算法,所以就百度了解了一下。

Manacher 算法

这里先贴上原文链接:

https://subetter.com/articles/manacher-algorithm.html

这里通过填充#字符来生成一个奇回文的想法很不错,我当时也在想如何辨别奇数偶数回文的方法,不过还是没想出来。
有点难,让我先捋一捋,明天再来补充。
我觉得这篇讲解的比较详细

https://www.cnblogs.com/z360/p/6375514.html

回来了,昨天太忙就没功夫好好思考一下,我觉得思路的难点主要在于下面这个式子以及已知回文子串的存在。

if(mx>i)
         Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取小

这个式子在上面的两篇文章中都有提到,这里就不详细阐述了,值得一提的是最好从头,i=0开始做一个详细的推导,就比较能理解这个式子的存在了。

总结

这里主要解释一下为什么他的时间复杂度是o(n),在马拉车算法中,一开始我觉得还是二次方的复杂度,后来想明白了。从我的观点来看,它主要避免了许多子字符串的重复检索,他给每个字符一个特定的半径标识,能通过已知的半径标识最大限度节省时间的得到后面字符的最大回文半径。

只有遇到还没有匹配的位置时才进行匹配,已经匹配过的位置不再进行匹配,所以对于T字符串中的每一个位置,只进行一次匹配,所以Manacher算法的总体时间复杂度为O(n),其中n为T字符串的长度,由于T的长度事实上是S的两倍,所以时间复杂度依然是线性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值