KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
下面是一个c++语言的简单实现
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int Snext(string m,int next[]){
int i,j,l;
i=0;
j=-1;
next[0]=-1;
l=m.length();
while(i<l){
if(j == -1 || m[i]==m[j]){
i++;j++;next[i]=j;
//cout<<i<<" "<<j<<" "<<next[i]<<endl;
}
else
j=next[j];
}
}
int KMP(string s,string m,int next[]){
int i,j,lm,ls;
i=j=0;
lm=m.length();
ls=s.length();
while(i<ls&&j<lm){
if(j==-1||s[i]==m[j]){
i++;j++;
}
else
j=next[j];
}
if(j>=lm) return i-lm;
return -1;
}
int main(){
string s,m;
int next[100]={0};
printf("PLease input the string: ");
cin>>s;
printf("PLease input the substring: ");
cin>>m;
Snext(m,next);
/*for(int i=0;i<8;i++)
cout<<next[i]<<" ";*/
cout<<KMP(s,m,next);
return 0;
}
输入测试数据
主串 asdfgh 模式串 fg
