关于KMP算法
KMP 算法是非常经典的字符串匹配算法,而且有可能是最经典的一个。同时它也是非常典型的一种优化算法,它把原本暴力法 O( mn ) 的最坏复杂度降低到了 O( m+n )(虽然实际上暴力法的执行复杂度期望依然是线性的),其思想非常具有典型性和可借鉴性,值得好好学习。 1 基本思想 KMP 算法的基本思想是,借助一个预先计算好的数组 pi ,在匹配了一定数量的模式的情况下,遇到不匹配的字符时,不像暴力法那样将待匹配的文本下标从上一次匹配的地方向后移动一个位置,并将已匹配的模式个数清零,而是利用已经匹配部分的信息,迅速跳过那些不可能匹配成功的文本开头,减少了暴力法中一些不必要的盲目搜索。 比如,对于模式 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 a b a b a b c a b c a b c d b c d b c d 如果从文本中的某一个字符开始,匹配到6号字符c时,出现了不匹配,此时已经匹配了6个字符。如果再从文本中下一个字符b开始,从模式的第0号字符开始继续尝试,就是暴力法的思想。而 KMP 算法比暴力法先进的地方就在于,它利用 模式 已匹配部分的信息,跳过那些已遍历的文本中不可能匹配的开头,直接进入有可能会产生匹配的文本开头,并更新相应的已匹配字符长度。比如,匹配到6号字符时,出现不匹配