设字符串为
S
S
S,首先我们要寻找它的对称中心,但发现对称中心可能在一个字符上,也可能在两个字符中间因为在两个字符中间的我们不好访问,于是我们可以在中间插入一些无关的字符,让字符来代替中间的空隙
我们记录一个数组
P
P
P,
P
i
P_i
Pi表示以
S
i
S_i
Si为中心的回文数列的最大半径如图,
P
7
=
6
P_7=6
P7=6,在记录
m
i
d
,
r
mid,r
mid,r,表示当前已知的
P
i
P_i
Pi中,
P
m
i
d
+
r
P_{mid}+r
Pmid+r是最大的,即右区间离
S
S
.
l
e
n
g
t
h
(
)
S_{S.length()}
SS.length()最近
于是对于一个未知的
P
i
P_i
Pi如果
i
⩽
P
m
i
d
+
r
i \leqslant P_{mid}+r
i⩽Pmid+r那么就可以根据回文数的对称性,确定在
m
i
d
−
r
⩽
i
⩽
m
i
d
+
r
mid-r \leqslant i \leqslant {mid}+r
mid−r⩽i⩽mid+r这段区间里,
P
i
=
m
i
n
(
P
关
于
m
i
d
对
称
的
点
,
m
i
d
+
r
−
i
)
P_i=min(P_{关于mid对称的点},mid+r-i)
Pi=min(P关于mid对称的点,mid+r−i),易得对称点为
2
∗
m
i
d
−
i
2*mid-i
2∗mid−i,于是
P
i
=
m
i
n
(
P
2
∗
m
i
d
−
i
,
m
i
d
+
r
−
i
)
P_i=min(P_{2*mid-i},mid+r-i)
Pi=min(P2∗mid−i,mid+r−i)
但是我们不知道
m
i
d
+
r
mid+r
mid+r后面是否还有相同的
P
x
,
P
y
P_x,P_y
Px,Py,所以要暴力枚举,最后更新
m
i
d
,
r
mid,r
mid,r