BF算法
#include<iostream>
using namespace std;
#define MAXSIZE 255
typedef struct {
char ch[MAXSIZE+1];
int length;
} SString;
int IndexBF(SString S,SString T) {
int i=0;
int j=0;
int count = 0;
while(i<=S.length-1 && j<=T.length-1) {
if(S.ch[i]==T.ch[j]) {
++i;
++j;
count++;
} else {
i = i-j+1;
j=0;
}
}
if(j>T.length-1) return count;
else return 0;
}
int main() {
SString S,T;
cout<<"输入主串和主串长度(中间用空格隔开)"<<endl;
cin >>S.ch>>S.length;
cout<<"输入模式串和模式串的长度(中间用空格隔开)"<<endl;
cin >>T.ch>>T.length;
cout<<"恭喜你,在主串的第"<<IndexBF(S,T)<<"个字符开始匹配上了"<<endl;
}
KMP算法
#include<iostream>
using namespace std;
#include <string.h>
#define MAXSIZE 255
typedef struct {
char ch[MAXSIZE+1];
int length;
} SString;
void getNext(SString T,int next[]) {
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];
}
}
}
int IndexKMP(SString S,SString T) {
int i=0;
int j=0;
int next[T.length];
while(i<=S.length-1 && j<=T.length-1) {
if(j==0 || S.ch[i]==T.ch[j]) {
++j;
++i;
} else
{
getNext(T,next);
j=next[j];
}
}
if(j>T.length-1) return i-T.length+1;
else return 0;
}
int main() {
SString S,T;
cout<<"输入主串长度和主串(中间用空格隔开)"<<endl;
cin >>S.length>>S.ch;
cout<<"输入模式串的长度和模式串(中间用空格隔开)"<<endl;
cin >>T.length>>T.ch;
cout<<IndexKMP(S,T)<<endl;
}