一、KMP是什么?
kmp是一种字符串匹配算法,通常是在主串中查询字串
二、暴力匹配与kmp对比
在主串s中查询t
暴力思路:遍历两个串,如果遇到不等则从s中的下一个位置比较,但是如果t中存在某些相同的部分,那么暴力遍历会有一些冗余的操作,比如上面的例子。
KMP思路:T中前五个字母,前两个和后两个是相同的,如果遇到不等,那么我们想要在s中找到下一个位置与t的头部能相等,x处不相等,那么x前的五个字母t中和s中是相等的,且t的前两个和后两个是相等的,那么我们便可以直接跳到下一个位置(头部相等);
上面思路成立的前提是t中存在 前面等于后面的情况,也就是公共前后缀。
三.最长公共前后缀
四.求next数组
next[i]表示以next[i]结尾的最长公共前后缀;
i代表后缀开头初始化为1;
j代表前缀末尾初始化为0;
如果next[i]==next[j] 那么++j;
否则看前面是否存在前后缀相等,如果存在直接转到下一个头部位置
五.完整KMP代码
遍历两个字符串,遇到不等,在next表中查询是否有相等的前后缀,有就直接跳转。
总结
kmp算法主要是利用匹配失败的信息,通过前缀表查询是否存在前后相等的状况,如果有那么可以跳过一些步骤,减少暴力匹配的冗余。