对朴素模式匹配算法的优化:
当我们匹配最后一个字符才发现匹配失败。
那么前面这些字符一定是与模式串对应的。
通过模式串的部分匹配
朴素模式匹配算法优化思路:
不匹配的字符之前,一定是和模式串一致的。
可以跳过中间好几个没有必要的对比
前面5个已知字符中我们已知ab当i=4和i=5时。
我们得到的结论并不依赖于主串,只与模式串有关。
前面这几个字符肯定是与模式串匹配的。
当第五个元素匹配失败后,主串指针i保持不变,模式串指针j=2
那如果第4个元素匹配失败呢?
主串指针i保持不变,模式串指针j=2
可令主串指针i不变,模式串指针j=1
IN CONCLUSION
现在呢,我们知道当第六个元素匹配失败,可令主串指针i不变,模式串指针j=3。
那我们接下来改一下例子哈
我们发现第5个元素匹配失败,那接下来令主串指针i不变,模式串指针j=2。
我们发现第2个元素发生失配,令主串指针i不变,模式串指针j=1.
第一个元素匹配失败,匹配下一个相邻字串,令j=0,i++,j++
中间省略,与上述相同。if
此时j超过了模式串的匹配范围而停止。
这个算法指对模式串T="abaabc"生效
第i个元素匹配失效,next[i]
模式串指针的数值由next数组存储。
这就是KMP算法
特殊情况下,if(j==0){i++;j++}
process:
(1)根据模式串T,求出next数组。
(2)利用next数组进行匹配(主串指针不回溯)
传入主串S,模式串T,以及与模式串相关的next数组。
我们来进行一个对比
改变的只是我们圈起来的部分。