从最长回文串到贪心和动态规划(1)

本文详细介绍了如何解决最长回文串问题,从暴力解法到改进方法,重点解析了Manacher算法(马拉车算法)的工作原理,包括算法的预处理、回文半径、MaxRight和pos的概念,以及在不同情况下如何扩展回文串。文章最后讨论了算法的时间和空间复杂度。
摘要由CSDN通过智能技术生成

可以去https://segmentfault.com/a/1190000003914228看原版,但是有些方面感觉我解释的要更多一些,同时改正了一处错误。

问题定义:

最长回文串问题:给定一个字符串,求出它的最长回文串长度。

如果一个字符串正着读和反着读是一样的,那么它就是回文串。

比如:

12321   a   aba   aaaa   tattattattat

1. Brute-force:

最简单粗暴的解法:找到字符串的所有子串遍历每一个子串以验证它们是否为回文串

一个子串由起点和终点决定,因此对于一个长度为n的字符串,一共有n^{2}个子串,这些子串的平均长度大约是n/2,所以这个解法的时间复杂度为O(n^{3})

2. 改进的方法:

显然,对于所有的回文串都是对称的!

长度为奇数的回文串以中间字符为对称轴左右对称,长度为偶数的回文串的对称轴在中间两个字符之间的空隙。能否利用这个性质来提高效率呢?当然!

我们知道整个字符串中的所有字符以及字符间的空隙,都可能是某个回文串的对称轴位置-----我们可以遍历这些位置,在每个位置上同时向左右两边扩展直到左右两边的字符不相同或者是达到边界为止。对于一个长度为n的字符串,这样的位置一共有n + n - 1 = 2n -1个,在每个位置上大约平均要进行n/4(就是n/2之后再/2)次字符比较,于是此算法的时间复杂度为O(n^{2}).

3. Manacher算法(马拉车算法)

对于一个较长的字符串,上面的复杂度是难以接受的,Can we do better?

来看看解法二存在的缺陷:

  1. 由于回文串长度的奇偶性造成了不同性质的对称轴位置,解法二要对奇偶两种情况分别处理
  2. 很多子串被重复访问很多次,造成较差的时间复杂度。

缺陷2可以这样看出来:

char: a b a b a
i   : 0 1 2 3 4

当i == 1或者 i==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值