朴素的模式匹配算法
一个例子:
从主串 S = "goodjob"中,找到子串 T = "job"的位置。我们通常需要下面的步骤。
1. 将子串"job"与主串S从第一位对应匹配。即判断 whether 'g' == 'j';
2. 判断结果为否,继续匹配 whether 'o' == 'j';
3. 直到找到第一位匹配 'j' = 'j';
4. 继续匹配完整 S[4:7] == 'job' == T。
是一种最简单的匹配算法,暴力易实现,但有许多冗余的步骤。
KMP 模式匹配算法
总的思想是:通过字符串已有的信息来规避朴素模式匹配中可以省略的步骤。
详细的过程不再赘述,在这里只进行简要的说明。
已知主串的下标为 i i i, 子串的下标为 j j j, 总结下来是两短句:“ i i i 不回溯, j j j 依 n e x t next next”。
i i i 不回溯:指的是在匹配过程中,主串的匹配下标永远只会增加或不变,不会再去匹配之前主串的下标。
j j j 依 n e x t next next:指的是子串的下标匹配规则是依照 n e x t next next 数组值。
那么下面要详细说明 n e x t next next 数组值是什么。
n e x t next next 数组值推导
先给出数学式的定义:
n e x t [ j ] = { 0 , 当 j = 1时 M a x { k ∣ 1 < k < j , 且 ′ p 1 . . . p k −