Manacher算法介绍

Manacher是一个 字符串算法,用于求 一个字符串中 最长的回文子串。他的时间复杂度可以达到 O(n);

除Manacher以外,字符串算法还有 BP算法、KMP算法、改进的KMP算法。

Manacher算法在思想上 和 改进的KMP算法 有相似之处,下面简要介绍一下Manacher算法核心思想:
假设现有字符串S: abcdcbab ;
根据字符串S构造字符串T,即在字符之间均插入一个 # ,构造结果如下:#a#b#c#d#c#b#a#b# ;
求字符串T中,以T[i]为中心的每个 回文子串 的最右边的字符到中心词的长度,分别为Len[i]:1 2 1 2 1 2 1 8 1 2 1 2 1 2 1 2 1 ;
根据规律可知,Len[i]-1 即 字符串S 中 以各个 元素 为中心 的 最长回文子串的 长度;

根据上述 思想 我们即可 求出 以 字符串S 每个元素为核心的 最长回文子串 的 长度。
为了能在 线性时间 内 求得 字符串 S 中 最长的回文子串长度,我们还需要在想出一些策略,Manacher 中使用的策略 和 改进的KMP算法 有点儿 类似,都是 想方设法 让算法在找 最长回文子串时,只遍历 每个元素一次。具体做法如下:
假如 我们现在要求 以 第i个 元素 为中心的 最长回文子串长度,在i之前的最长回文子串 以Po为中心,其最长回文子串 最右边的元素位置为 P;
我们首先求以 Po 为中心,关于i元素的对称元素 j: j – Po – i;
然后求 以j为中心的 最长回文子串 的Len[j] 与 P-i 的 大小关系:
if(Len[j] <= (P-i)):则说明Len[i] = Len[j];
elif:
while(S[i-Len[j]] == S[i+Len[j]]){Len[j] ++ ;} //通过这种方式可以不用回溯的求出 以元素i为中心的最长回文子串;
求出 以元素i为中心的最长回文子串 与 Po的进行 比较,如果i的长度更长,则更新 Po=i,P=right_i;

重复上述过程,直到找到 最长回文子串。

伪代码:
构建字符串T;
用Manacher方式 遍历 字符串T中每个字符,用一个标志 Max 记录 在此过程中 最大的 回文子串右半部分长度;
Max-1 即为 原字符串S的 最大回文子串 长度;

具体参考博文如下:
Manacher算法总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarah ฅʕ•̫͡•ʔฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值