1.BF核心代码为:i=i-j+2;j=1;
即匹配失败时,主串的游标i移动到上一轮开始位置的下一个位置,子串的游标j回到第一个位置
2.kmp算法理解next与nextval数组的推导过程与求解方法。
理解kmp算法如何用next数组匹配
#include <stdio.h>
#include <string.h>
#define MAXLEN 255
//J移动的次数
int t1,t2=0;
typedef struct{
char ch[MAXLEN+1];
int length;
}SString;
int *next(SString T){
int next1[MAXLEN+1];
int i=1;
next1[1]=0;
int j=0;
while(i<T.length){
if(j==0||T.ch[i-1]==T.ch[j-1]){
++i;
++j;
next1[i]=j;
}else{
j=next1[j];
}
}
return next1;
}
int KMP(SString S,SString T,int next[]){
int i=1;
int j=1;
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i-1]==T.ch[j-1]){
++i;
++j;
} else{
j=next[j];
}
t1++;
}
if(j>T.length) return i-T.length;
else return 0;
}
int BF(SString S,SString T){
int i=1;
int j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i-1]==T.ch[j-1]){
++i;
++j;
}else{
i=i-j+2;
j=1;
}
t2++;
}
if(j>T.length) return i-T.length;
else return 0;
}
int main()
{
SString S,T;
while(1){
scanf("%s",S.ch);
scanf("%s",T.ch);
S.length=strlen(S.ch);
T.length=strlen(T.ch);
int *t=next(T);
printf("%d\n",KMP(S,T,t));
printf("%d\n",BF(S,T));
printf("KMPj移动次数为:%d\n",t1);
printf("BFj移动次数为:%d\n",t2);
int n;
printf("输入1继续,0结束\n");
scanf("%d",&n);
if(n==0) break;
}
return 0;
}