July关于kmp的文章
Matrix67关于kmp的解释
特别推荐Matrix67的博客,其中关于next数组部分原理讲解的很简单
可以使用的代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int next[1000];
string s,p;
void getNext(){
int k=-1;
int j=0;
next[0]=-1;
int l=p.length();
while(j<l-1){
if(k==-1||p[k]==p[j]){
k++;
j++;
next[j]=next[j-1]+1;
}
else{
k=next[k];
}
}
}
int kmpSeach(){
int i=0;
int j=0;
int ls=s.length();
int lp=p.length();
while(i<ls&&j<lp){
if(p[j]==s[i]||j==-1){
j++;
i++;
}
else{
j=next[j];
}
}
if(j==lp)
return i-j;
else return -1;
}
int main(){
getline(cin,s);
getline(cin,p);
getNext();
cout<<kmpSeach()<<endl;
return 0;
}