KMP算法
算法思想:减少BF算法中的重复匹配次数:
所谓重复匹配即:在失配时,已经匹配过的序列的后缀中含有模式的前缀,但BF算法直接回退主串与模式串的指针。
KMP算法的核心思想就是在发生失配时,利用已经匹配过的字符串的信息,将模式串移动到与模式前缀相同的后缀的位置,可以减少比较次数。
在发生失配时指针具体要移动到哪里?
(1)根据模式串,通过求前缀和后缀的交集字符串的长度,可以算出来next数组,next数组对应的值就是若当前字符发生失配的话,模式串的指针j要移动到的位置,以进行下一次的匹配。
(2)若next数组对应的值为0,则表示主串的指针i要后移一位。
特点:(1)在匹配过程中主串的指针不会发生回溯
(2)时间复杂度为O(m+n)
KMP算法还可以进行进一步的优化:
改进的KMP算法:
发生失配时若将要移动到的字符与刚刚发生失配的时候的字符相同的话,会进行一次不必要的匹配,所以对next进行一次递归修正,即检查该字符对应的next值在模式串中对应的字符是否与原字符相等。
稳扎稳打才能取得最后的胜利