BF和KMP算法(包括修正):
#include<iostream>
#include<cstring>
#include<cstdio>
#include <algorithm>
#define MAXLEN 255
using namespace std;
typedef struct Chunk{
char ch[MAXLEN+1]; //存储串的一维数组
int length; //串的当前长度
}SString;
//BF算法
int Idex_BF(SString S,SString T,int pos){
int i=pos;
int j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]) {++i; ++j;}
else {i=i-j+2; j=1;}
}
if(j>T.length) return i-T.length;
else return 0;
}
//KMP算法
void get_next(SString T,int next[MAXLEN+1]){
int i=1;next[1]=0;int j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){++i;++j;next[i]=j;}
else j=next[j];
}
}
void get_nextval(SString T,int nextval[MAXLEN+1]){
int i=1;nextval[1]=0;int j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int Index_KMP(SString S,SString T,int next[]){
int i=1;
int j=1;
while(j<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]) {++i; ++j;}
else j=next[j];
}
if(j>T.length) return i-T.length;
else return 0;
}
int main(){
SString M; //主串
SString S; //模式串
int next[MAXLEN+1];
int k;
cout<<"*********请输入模式串*********"<<endl;
scanf("%s",S.ch+1);
S.length = strlen(S.ch+1);
// cout<<S.length;
cout<<"*********请输入主串*********"<<endl;
getchar();
scanf("%s",M.ch+1);
M.length = strlen(M.ch+1);
// printf("%d\n", M.length);
cout<<"*******请选择算法:1.BF算法 2.KMP算法(未修正) 3.KMP算法(修正)*******"<<endl;
cin>>k;
switch(k){
case 1:
cout<<"*********现在是BF算法!*********"<<endl;
cout<<"模式串第一次出现的位置是:"<<Idex_BF(M,S,1)<<endl;
break;
case 2:
cout<<"*********现在是KMP(未修正)算法!*********"<<endl;
get_next(S,next);
cout<<"模式串第一次出现的位置是:"<<Index_KMP(M,S,next)<<endl;
break;
case 3:
cout<<"*********现在是KMP(修正)算法!*********"<<endl;
get_nextval(M,next);
cout<<"模式串第一次出现的位置是:"<<Index_KMP(M,S,next)<<endl;
break;
default:
cout<<"选择错误!"<<endl;
break;
}
return 0;
}