//本程序是引用他人的思想,额,忘记是哪位大神了,这个程序是之前写的
#include <iostream>
#include <cstring>
using namespace std;
//方便对照,BFMatch函数是原始匹配函数
int BFMatch(char *s,char *p){
int i=0,j=0;
int nSLen=strlen(s),nPLen=strlen(p);
while(i<nSLen){
j=0;
while(s[i]==p[j]&&j<nPLen){
i++;
j++;
}
if(j==nPLen){
return i-nPLen;
}
i=i-j+1;//指针i的回溯
}
return -1;
}
//getNext函数创建next[],作用与指针回调
void getNext(char *p,int *next){
int j=0,k=-1;
int nPLen=strlen(p);
next[0]=-1;
while(j<nPLen-1){
if(k==-1||p[j]==p[k]){//匹配情况下p[j]=p[k],p[0..k]=p[j-k,j]
k++;
j++;
next[j]=k;//next[j+1]=next[j]+1=k+1;
}else{
k=next[k];
}
}
}
//KMP算法根据next[]来进行匹配
int KMPMatch(char *s,char *p){
int i=0,j=0;
int nSLen=strlen(s),nPLen=strlen(p);
int next[100];
getNext(p,next);
while(i<nSLen){
if(j==-1||s[i]==p[j]){
i++;
j++;
}else{
j=next[j];//消除了指针i的回溯
}
if(j==nPLen){
return i-nPLen;
}
}
return -1;
}
int main(){
char *s="ababc";
char *p="abc";
cout<<"s:"<<s<<endl;
cout<<"p:"<<p<<endl;
cout<<"模式匹配位置:"<<BFMatch(s,p)<<endl;
cout<<"模式匹配位置:"<<KMPMatch(s,p)<<endl;
return 0;
}