sql server 如何设置字符串长度_算法学习|Manacher算法:如何求一个字符串的最长回文字符串长度...

作者:lykkk
链接:https://ac.nowcoder.com/discuss/193977
来源:牛客网

问题

什么是回文串,如果一个字符串正着度读和反着读是一样的,这个字符串就被称为回文串。
such as

noon level aaa bbb

既然有了回文,那就要有关于回文的问题,于是就有了——最长回文子串:给定一个字符串,求它的最长回文子串长度。

暴力

找出所有的子串,遍历每个子串判断他们是否为回文串。

时间复杂度

优化

因为回文串是对称的,根据这个性质,枚举每个位置,找在这个位置上能扩展到的最长回文串。

时间复杂度

Manacher算法

打开洛谷的模板题发现数据范围是

,还是不能过,怎么办。

先分析优化后的暴力的不足。

1.对于长度为奇数的回文和长度为偶数的回文,它们的对称轴是不一样的,要分类讨论。
2.有些子串会被访问多次。
比如 :
char: a b a b a b a ...  
i : 0 1 2 3 4 5 6 ...
我们枚举到第
位:
时第一个"aba"被遍历了一次;
时第一个"aba"又被遍历了一次;
时第一个"aba"双被遍历了一次;

.......……
时第一个"aba"又双叒叕被遍历了一次。

处理字符串长度的奇偶性带来的对称轴不确定问题

如果字符串的长度都是奇数就好办了。

处理原来的字符串,在收尾和所有空隙插入一个相同的无关的字符,插入后原字符串中是回文的子串还是回文串,不是回文的子串的依然不是。

但字符串的长度都变成了

,都成了奇数。

为什么是

,因为有
个空,两边又分别插入了
个,加起来等于

如:

长度为奇数的字符串
ababa ---> @#a#b#a#b#a#
长度为偶数的字符串
1221 ---> @#1#2#2#1#

'@'用来防止数组越界

找最长回文串

回文半径:把一个回文串中最左或最右位置的字符到其对称轴的距离称为回文半径

在Manacher算法中,我们用

表示第
个字符的回文半径
    char : # a # b # c # b # a #
    p[i] : 1 2 1 2 1 6 1 2 1 2 1
p[i] - 1 : 0 1 0 1 0 5 0 1 0 1 0
       i : 1 2 3 4 5 6 7 8 9 10 11

显然,最大的

就是答案
显然这个结论非常不显然,单从数值上看的话,插入完字符之后对于一个回文串的长度为 原串长度*2+1,等于 这个回文串回文半径*2+1,显然相等。

这样我们的问题就转换成了怎样快速的求出

数组

在这里我们利用回文串的对称性扩展回文串,p[i]不再直接赋值为1,而是根据之前求出的p[j],0<j<i。

我们用

表示所有字符产生的最大回文子串的最大右边界,
表示产生这个最大右边界的对称轴的位置。
为什么要维护这些东西,因为我们要利用回文串的对称性来更新当前位置的值,维护了右边界(
)后就可以直接判断当前位置是否可以直接利用对称性来更新(因为之前找到的回文串最右端就是到
,超出
的话就不能利用对称性来更新了);
是对称轴,用来求关于
对称的位置

c36d1666-7513-eb11-8da9-e4434bdf6706.png

中间的#懒得画了就

如图,假设我们已经求出了

,当
时,因为
被更新过了,而
之后的位置,第
个字符一定落在
的右边,毋庸置疑。但这是我们关心的还是
是在
的左边还是右边。

以下内容为了方便我们定义:

  • 表示以
    为对称轴的回文串(用红色的箭头表示);
  • 表示以
    为对称轴的回文串(用蓝色的箭头表示);
  • 表示以
    为对称轴的回文串(用绿色的箭头表示);

情况1:i < mx

如上图,利用回文串的性质,对于

,我们可以找到一个关于
对称的位置
,进行加速查找

但在这里又细分为了三种情况

(1)

c66d1666-7513-eb11-8da9-e4434bdf6706.png

显然此时

对于这种情况,串

不可以再向两边扩张。

如果可以向两边扩张的话,

也可以再向两边扩张,而
已经确定了,所以串
不向两边扩张。

(2)

c96d1666-7513-eb11-8da9-e4434bdf6706.png

显然此时

与(1)不同的是,串

是可以再向两边扩张的。

应该很显然,一比划就知道。

(3)

ca6d1666-7513-eb11-8da9-e4434bdf6706.png

此时

这时我们只能确定串

以内的部分是回文的,并不能确定串
和串
相同。

同样,这时我们的串

是不可以再向两端扩张的。

cf6d1666-7513-eb11-8da9-e4434bdf6706.png

如果串

可以扩张,如图,则
,根据对称性
,又因为
,所以
,可以看到,串
可以继续扩张,因为
已经固定了,所以串
不可以继续扩张

情况2:i >= mx

d06d1666-7513-eb11-8da9-e4434bdf6706.png

这时之前记录的信息都用不上了,于是


综上所述
if 

代码

P3805 【模板】manacher算法

#include 

与作者交流:https://ac.nowcoder.com/discuss/193977

更多算法和题解:https://ac.nowcoder.com/acm/contest/discuss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值