简介
本文是笔者对KMP算法的理解,我会在不断的磨练中去理解KMP算法并加以修改本文的一些不足之处
原理
KMP算法与传统的字符串匹配不同,KMP算法是通过next数组获得当匹配失败的时候下一个跳转到的字符的位置,然后在此位置上继续匹配,而不需要在每次匹配失败的时候返回到首字符重新匹配
框架
KMP算法主要由两部分组成:1、生成模式串的next数组 2、根据next数组进行字符串匹配
步骤&解析
1、生成模式串的next数组
next数组的作用是记录每一个字符的最长公共前后缀(前缀是包含首字符但不包含尾字符的子串,如abcd的前缀包括a,ab,abc但不包括abcd,因为含有尾字符d;后缀是包含尾字符但不包含首字符的子串,如abcd的后缀包括d,cd,bcd但不包括abcd,因为含有首字符a),如abab的最长公共前缀是ab,ababa的最长公共前缀是aba,通过记录最长公共前后缀就可以知道主串与模式串在某一个字符匹配失败时应该跳到模式串的哪一个位置继续匹配,从而减少了匹配时间。
上图为模式串与其对应的next数组,默认首个字符在next数组的值为0,假设模式串为s,s[1]的最长公共前后缀为0,因为s[0]和s[1]不相等,s[2]的最长公共前后缀为1,因为s[0]=s[2],s[3]的最长公共前后缀为2,因为s[0:2]=s[2:4],所以最长公共前后缀为2,以此类推
那么,应该如何根据next数组来跳转呢?