12-Manacher算法

1.Mancher算法

1.1求回文字串的经典解法

求子串长度,后推广到求最长回文字串长度,例如:abce12130decba,那么最长的回文字串就是121.

求回文长度的经典解法:以每一个字符为对称轴向外扩,但是这样只能求出长度为奇数的回文。经典做法的优化:对于长度为偶数的回文,可以在原字符串之间加入新的字符,这样就能把奇偶长度的都求出来。问:加入的新字符串是否一定要为原字符串中没有出现过的字符?答:不需要,因为比对的时候一直都是新的跟新的比,旧的跟旧的比,不会影响旧的之间是否相等的问题,所以加入的字符可以是随意的字符

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

 1.2回文半径、回文直径、回文半径数组

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

1.3向右扩最长位置:右边界R,向右扩的中心点C

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

人为定义R、C一开始为-1 

2用manacher解决回文问题

2.1来到一个点,这个点不在最右边界的范围里

直接暴力扩

2.2中心点在最右回文边界的内部

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

 

2.2.1当前点i的对称点i'的回文在不在最大回文L-R之间

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

此时i的回文半径跟i'的是一样的(i'的回文半径之前已经求了放在回文数组中了) 

2.2.2当前点i的对称点i'的回文半径超过了L的范围

此时i的回文半径就是i- R的范围

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

 2.2.3当前点i的对称点i'的回文长度刚好跟L重合

此时i到R一定是回文,但是会不会更长就要接着往下试,即判断i点可以直接从R的下一个点开始试

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

3.manacher伪代码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUG5KZz8=,size_20,color_FFFFFF,t_70,g_se,x_16

计算时间复杂度:每个位置扩的时候都失败一次的话,那么时间复杂度就是O(N);如果每一阔,R都会变大,那么此时的时间复杂度也是O(N)。

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUG5KZz8=,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUG5KZz8=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值