kmp算法:一种字符串匹配算法,可以处理两个串得匹配问题,求一个串在另一个串中出现次数,判断a是b的字串等等。
算法来源:考虑对于a,b串暴力匹配,枚举b串出现的位置之后,将位置后面b串长度个位置挨个匹配,这种算法将会多次遍历b串,对于很多情况,出现位置只向后移动一次并不能与b串匹配。
考虑我们先求出b串的前i位串的最长公共前后缀(border)。
有这样的性质:对于a串和b串匹配到一点失配,令b串从nxt(border)开始继续匹配,这样的做法可以保证b串匹配到了a的每个位置。
nxt的求法:nxt[i]可以用之前的nxt[j]推出:
当且仅当
string[nxt[j]+1]==string[i]
且
string[1...nxt[j]]==string[i−nxt[j].....i−1]
所以可以初始一个j=i-1然后一直跳nxt[j]直到满足条件。
快省选了草草写个小总结,有可能有不对的地方。