先贴出算法导论中的算法
对于k=π[k],想了好久才想明白。
当出现k=π[k]时,此时已经满足了
P
1
.
.
.
P
k
=
P
q
−
k
.
.
.
P
q
−
1
P_1...P_k = P_{q-k}...P_{q-1}
P1...Pk=Pq−k...Pq−1,正要判断
P
k
+
1
P_{k+1}
Pk+1是否等于
P
q
P_q
Pq,而发现
P
k
+
1
≠
P
q
P_{k+1}\neq P_q
Pk+1=Pq,因此进入while循环,执行
k
=
π
[
k
]
k=\pi [k]
k=π[k],也就是说,此时
π
[
q
]
\pi[q]
π[q]一定小于等于k,否则
P
k
+
1
=
P
q
P_{k+1}= P_q
Pk+1=Pq
此时应该想的是,找到最大的 i ,使得
P
1
.
.
.
P
i
=
P
q
−
i
+
1
.
.
.
P
q
P_1...P_i = P_{q-i+1}...P_{q}
P1...Pi=Pq−i+1...Pq,这可以分为两步,先判断
P
1
.
.
.
P
i
−
1
P_1...P_{i-1}
P1...Pi−1是否等于
P
q
−
i
+
1
.
.
.
P
q
−
1
P_{q-i+1}...P_{q-1}
Pq−i+1...Pq−1,若相等,再判断
P
i
P_i
Pi是否等于
P
q
P_q
Pq(而对于之前匹配的结果,有
P
1
.
.
.
P
k
=
P
q
−
k
.
.
.
P
q
−
1
P_1...P_k = P_{q-k}...P_{q-1}
P1...Pk=Pq−k...Pq−1,故只需判断
P
1
.
.
.
P
i
−
1
P_1...P_{i-1}
P1...Pi−1是否等于
P
k
−
i
+
2
.
.
.
P
k
P_{k-i+2}...P_{k}
Pk−i+2...Pk),这时你就会发现,要找到最大的 i ,使得
P
1
.
.
.
P
i
−
1
=
P
k
−
i
+
2
.
.
.
P
k
P_1...P_{i-1}=P_{k-i+2}...P_{k}
P1...Pi−1=Pk−i+2...Pk,这不就是
π
[
k
]
\pi [k]
π[k]吗?然后问题就解决了。这里的第一步判断对应于
k
=
π
[
k
]
k=\pi [k]
k=π[k],第二步则对应于while循环中的
P
[
k
+
1
]
≠
P
[
q
]
P[k+1]\neq P[q]
P[k+1]=P[q]
附上图便于理解