KMP算法
KMP算法是有三位计算机科学家 D.E.Knuth、J.H.Morris、V.R.Pratt提出,取自三人姓氏首字母。
KMP算法是String Search算法,之前搜索String,可以用BF,或者BM。
BF
暴力算法,对主串和模式串进行逐个比较。第一轮时,先对第一个字符进行比较,如果不合适就将模式串右移一位,然后继续比较;依次类推,直到合适匹配或者不符合为止。这样比较由于每次都要重头比较,效率太低。
BM
模式串的比较是从右到左,模式串的移动是从左到右,借用坏字符规则和好后缀规则,在每一轮比较时,可以让模式串尽可能的多移动几位。
KMP算法
和BM很相似,也是为了让模式串在每一轮多移动几位。
首先先明白字符串的前缀和后缀。比如一个string,{ababac},前缀集合就是{a,ab,aba,abab,ababa},后缀集合就是{babac,abac,bac,ca,a},那么交集就是{a},就是公共子串。
假设主串{ABABABAC},模式串{ABABAC},那么先找到公共子串{ABA},在主串和模式串中可以分别称为最长可匹配后缀子串和最长可匹配前缀子串
当C与B不匹配的时候,就根据获得的公共子串的长度,进行移动,找模式串中的长度+1位置的元素,和主串进行比较。比如例子中是3,就右移至和最长可匹配后缀子串相匹配,找第四位与主串相对的位置比较。
由此可以生成next数组,来缓存记录找到的最长可匹配后缀子串和最长可匹配前缀子串。