KMP算法详解(本文章的KMP算法的实现是用C语言,没有进行串的存储结构的实现,使用的是char数组)
-
引言:
我们在小学的时候老师一定教过我们怎么查字典(不知道怎么查字典的请自行百度),其实查字典的一个过程,就好像我 们在写代码有时候需要在一个很长的字符串中去查找一个(或一段)子串,这个时候我们就会写一个程序来帮助我们找。也就引出了朴素模式匹配算法。
由于朴素模式匹配算法 的效率过于低,这时候就有三个大佬(D.E.Knuth、J.H.Morris、V.R.Pratt)忍受不了了,决定发明一个效率更高的模式匹配算法,这个时候KMP模式匹配算法便诞生了。 -
单词解释:
SubString : 子串;
PriString : 主串;
SubIndex : 子串的下标;
PriIndex : 主串的下标; -
朴素算法:
根据朴素模式算法我们知道它的实现思想就是,子串从下标0开始遍历,主串从下标0开始遍历,如果:SubString[SubIndex] == PriString[PriIndex] 那么SubIndex+1, PriIndex+1;否则 : SubIndex = 0, PriIndex返回到上次匹配的首位的下一个下标。反复循环,直到主串全部遍历完毕,返回结果。由此可知朴素算法的时间复杂度为O(m+n); m为主串的长度,n为子串的长度(由于该算法实现思想比较简单,这里就不做代码演示了)。 -
KMP算法思路:
这里只进行KMP算法实现的思路,具体代码实现会在代码演示里进行一一说明(注释思路很清晰)。1、第一种情况(子串首字符不与后面串中任意一个字符相等)