KMP字符串匹配算法
对于字符串的匹配,传统的暴力求解的方式BF算法具有很多的缺点,关键就是在于主串需要回溯的问题,导致算法的时间复杂度是O(n*m),而KMP算法可以完成线性的时间复杂度O(m+n).
KMP算法的核心就是next数组,当模式匹配串失配的时候,next数组指示应该用模式匹配串中的那个字符来进行下一轮匹配(也就是模式匹配串回溯的位置)。而next数组的产生是取决于模式匹配串自身。这里考虑两种情况:
1. 当模式匹配串中没有重复的元素:每一次模式匹配串的回溯都会从头开始
2. 当模式匹配串中有重复的元素:
next数组的值是前后缀重合元素的最大的长度, "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。比如说 A B C A B C,前缀:[ABCAB,ABCA,ABC,AB,A],后缀[BCABC,CABC,ABC,BC,C]前后缀重合的最大的长度是3。
代码:
注意初始化值为-1,当两个字符相等的时候,后缀对应位置的next数组的值就是前缀的下标,因为前缀的下标就表示前后缀重合的长度了,如果两个字符不相等的时候,前缀需要进行回溯,回溯的下标由next数组决定。