KMP算法可用于“串匹配”问题。
用单纯的蛮力法进行串匹配的时候,只是在无脑回溯待匹配串与模式串(详细的不说了),当然这也是解决“串匹配”问题时最直接的想法
但KMP算法的思想,却省去了待匹配串与模式串的回溯,遇到不匹配的字符,模式串选择的是向后移动(其实效果等同于模式串当前不匹配字符的下标回溯到前面的某个位置),从而缩短了时间复杂度。
KMP算法之所以减少了时间复杂度,关键在于之前对于模式串有效的分析,找到模式串中“隔三差五”出现的相同字符或子串,并将其记录到next[]中,一旦遇到不匹配的字符,则将模式串向后移动到上一次出现相同的字符或字符串的位置。(更详细的解说其他人的博客中有,下面是链接KMP算法)
我这里重点记录一下2种求next[]数组的方法(怕以后自己忘了……)
next[]数组中记录的是模式串中在位置i处相等的前缀与后缀的长度
例如"abcab",next[0]代表子串"a",next[1]代表子串"ab",next[2]代表"abc",next[3]代表"abca",next[4]代表"abcab"
a,只有一个字符,不存在前缀与后缀之分,因此next[0] = 0;
ab,前缀{a},后缀{b},不存在相等的前后缀,因此next[1] = 0;
abc,前缀{a,ab}&#