#include<string>
#include<iostream>
using namespace std;
int KMP(string& pat,string& str,int k,int *next){//返回pat第一次匹配到str的数组位置
int posP=0;
int posT=k;
int lengthP=pat.length();
int lengthT=str.length();
while(posP<lengthP && posT<lengthT){
if(posP==-1 || pat[posP]==str[posT]){
posP++;
posT++;
}
else
posP=next[posP];
}
if(posP<lengthP)
return -1;
else
return posT-lengthP;
}
void getNext(string& str,int next[]){
int j=0,k=-1,lengthP=str.length();
next[0]=-1;
while(j<lengthP){
if(k==-1 || str[j]==str[k]){
j++;
k++;
next[j]=k;
}else
k=next[k];
}
}
void main(){
string str,pat;
cout<<"输入目标串:";
cin>>str;
cout<<"输入模式串:";
cin>>pat;
int size=pat.length();
int *next,k=0;
next=new int[size];
getNext(pat,next);
for(int i=0;i<size;i++){
cout<<next[i];
}
cout<<endl;
cout<<KMP(pat,str,k,next);
}
运行截图:
用一个辅助数组next[]