基本概念
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
—————————引用自百度百科
先来看一个问题:
匹配字符串:ababababac
模式匹配串为:ac
要求返回模式匹配串在匹配字符串中的下标,如果匹配失败返回-1
对于这样一个问题我们可以很轻松的想出一个解决算法。
就是将匹配串ac,按个地与字符串进行匹配,如果匹配成功,则返回对应下标。不匹配则跳到下一个,继续按个与匹配串比较,直到比较完字符串为止。我们称这种算法为BF算法。就是暴力破解。
具体过程如下:
第一次匹配 第二次匹配 ... 最后一次匹配
字符串: ababababac ababababac ababababac
匹配串: ac(在c处不匹配x) ac(在a处不匹配x) ac (完全符合,匹配成功,返回a的下标)
我们发现这种匹配效率很差,如果编程实现,我们要先遍历字符串数组,接着再遍历匹配串数组,进行挨个比较。时间复杂度就为O(m*n).
有没有什么算法能让我们直接跳过中间那些相同的字符,进而简化我们匹配的步骤呢?这样子就引出了KMP算法的概念。这个算法就是最大程度上简化匹配步骤,从而达到匹配字符串的目的。
算法核心
NEXT函数
void kmp_next(char *s,int next[]){
int j,i;
int k=0;//前后缀交集最大数
j=0;//后索引
i=1;//前索引
next[j]=0;
while(i<strlen(s)){
//相同操作
if(s[j]==s[i]){
k++;//多一个相同就多增加1
next[i]=k;//对应next数组位置的值
i++;//前索引向前
j