最长回文字串--马拉车(Manacher)算法模板

139. 回文子串的最大长度#include<bits/stdc++.h>#include <unordered_map>using namespace std;template<class...Args>void debug(Args... args) {//Parameter pack auto tmp = { (cout << args << ' ', 0)... }; cout << "\n";}t
摘要由CSDN通过智能技术生成

描述

给定一个长度为 n n n 的字符串 s s s,请找到所有对 ( i , j ) (i, j) (i,j) 使得子串 s [ i … j ] s[i \dots j] s[ij] 为一个回文串。当 t = t rev t = t_{\text{rev}} t=trev 时,字符串 t t t 是一个回文串( t rev t_{\text{rev}} trev t t t 的反转字符串)。

更进一步的描述
显然在最坏情况下可能有 O ( n 2 ) O(n^2) O(n2) 个回文串,因此似乎一眼看过去该问题并没有线性算法。

但是关于回文串的信息可用 一种更紧凑的方式 表达:对于每个位置 i = 0 … n − 1 i = 0 \dots n - 1 i=0n1,我们找出值 d 1 [ i ] d_1[i] d1[i] d 2 [ i ] d_2[i] d2[i]。二者分别表示以位置 i i i 为中心的长度为奇数和长度为偶数的回文串个数。换个角度,二者也表示了以位置 i i i 为中心的最长回文串的半径长度(半径长度 d 1 [ i ] d_1[i] d1[i] d 2 [ i ] d_2[i] d2[i] 均为从位置 i i i 到回文串最右端位置包含的字符个数)。

举例来说,字符串 s = a b a b a b c s = \mathtt{abababc} s=abababc s [ 3 ] = b s[3] = b s[3]=b 为中心有三个奇数长度的回文串,最长回文串半径为 3 3 3,也即 d 1 [ 3 ] = 3 d_1[3] = 3 d1[3]=3

a   b   a   b s 3   a   b ⏞ d 1 [ 3 ] = 3   c a\ \overbrace{b\ a\ \underset{s_3}{b}\ a\ b}^{d_1[3]=3}\ c a b a s3b a b d1[3]=3 c

字符串 s = c b a a b d s = \mathtt{cbaabd} s=cbaabd s [ 3 ] = a s[3] = a s[3]=a 为中心有两个偶数长度的回文串,最长回文串半径为 2 2 2,也即 d 2 [ 3 ] = 2 d_2[3] = 2 d2[3]=2

c   b   a   a s 3   b ⏞ d 2 [ 3 ] = 2   d c\ \overbrace{b\ a\ \underset{s_3}{a}\ b}^{d_2[3]=2}\ d c b a s3a b d

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值