描述
给定一个长度为 n n n 的字符串 s s s,请找到所有对 ( i , j ) (i, j) (i,j) 使得子串 s [ i … j ] s[i \dots j] s[i…j] 为一个回文串。当 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=0…n−1,我们找出值 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