BF算法
cpp
#include<iostream>
using namespace std;
//#include <string.h> //字符串处理
#define MAXSIZE 255
//串的定长顺序存储结构
typedef struct {
char ch[MAXSIZE+1];
int length;
} SString;
//bf算法
int IndexBF(SString S,SString T) {
//从主串和模式串的第一个开始比较,因为第一个字符下标是0,所以i=0,j=0
int i=0;
int j=0;
int count = 0;
//当所有字符比较完后就跳出循环 下标从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; //匹配不上,i移动到下一个字符,j从头开始
j=0;
}
}
//当模式串的j>T.length-1,说明模式串的所有字符都匹配到主串中的一个连续字符序列,
// 匹配成功,返回匹配上的第一字符在主串中的位置
if(j>T.length-1) return count; //其实是i-(T.length-1) 得到匹配上的第一字符在主串中的位置
else return 0;
}
//主函数
int main() {
//输入主串和模式串
SString S,T;
cout<<"输入主串和主串长度(中间用空格隔开)"<<endl;
cin >>S.ch>>S.length;
cout<<"输入模式串和模式串的长度(中间用空格隔开)"<<endl;
cin >>T.ch>>T.length;
//调用bf算法
cout<<"恭喜你,在主串的第"<<IndexBF(S,T)<<"个字符开始匹配上了"<<endl;
}
KMP算法
cpp
#include<iostream>
using namespace std;
#include <string.h> //字符串处理
#define MAXSIZE 255
//串的定长顺序存储结构
typedef struct {
char ch[MAXSIZE+1];
int length;
} SString;
//计算next的值
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];
}
}
}
//kmp算法
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;
//调用bf算法
cout<<IndexKMP(S,T)<<endl;
}