串的模式匹配的算法改进过程
改进的地方
1、从 Brute Force 到 KMP:
建立 n e x t [ j ] next[j] next[j]数组提取加速匹配的有用信息;
有用信息:
暴力算法要一个一个进行比对,但如果知道匹配失败的位置 t j t_j tj之前的k个字符( t j − k . . . t j − 1 t_{j-k}...t_{j-1} tj−k...tj−1)和串开头的k( t 1 . . . t k − 1 t_1...t_{k-1} t1...tk−1)个字符相同,那么就可以省去一些无效比较(具体过程还是得自己试一下)
2、从 KMP 到 改进的 KMP
将 n e x t [ j ] next[j] next[j]升级;
升级:
减少无效比较,直接回溯
j
=
n
e
x
t
v
a
l
[
j
]
j=nextval[j]
j=nextval[j]。
直接回溯的条件——
t
j
=
t
n
e
x
t
[
j
]
t_j=t_{next[j]}
tj=tnext[j]
否则还是回溯和 KMP 一样即
j
=
n
e
x
t
[
j
]
j=next[j]
j=next[j]
理由:
匹配失败的位置字符
s
i
s_i
si与
t
j
t_j
tj不匹配,那么和
t
k
t_k
tk也不匹配。减少的无效比较就是上述过程。