朴素模式匹配算法的缺点:
当某些子串与模式串能部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加
寻找 “google” 模板
解决:
改进思路- -
KMP算法
主串指针不回溯,只有模式串指针回溯。
所以不同的模式串对应不同的表。
观察:求模式串的next数组。
next数组:当模式串的第j个字符匹配失败时,令模式串跳到next[j]再继续匹配。
串的前缀:包含第一个字符,且不包含最后一个字符的子串。
串的后缀:包含最后一个字符,且不包含第一个字符的子串。
当j个字符匹配失败,由前1~j-1个字符组成的串记为S,则:next[j] = S的最长相等前后缀长度+1
练习一
练习二
所以KMP算法的平均时间复杂度:O(n+m)
朴素模式匹配算法的缺点:最坏的时间复杂度O(nm)
KMP算法的优化:
多加了一个nextval[j]数组、
KMP算法优化:当子串和模式串不匹配时 j = nextval[j]