尽管明天考电路分析基础,但复习到想吐的话还是来看看C语言代码放松一下,整了个KMP的算法实现,原本以为抄抄书随便过一下就行,却发现一个bug:
循环在j=-1时会莫名其妙地终止,必须在条件里加一个特殊判断才行,有大佬知道是怎么回事吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define maxsize 256
typedef char sstring[maxsize];
sstring T,P;
void Get_next(sstring P,int next[]){//next的数组构建,增加算法的效率
int i,j,k;
j=0;k=-1;next[0]=-1;
while(j<strlen(P)){
if(k==-1||P[j]==P[k]){
j+=1;
k+=1;
next[j]=k;
}else{
k=next[k];
}
}
}
int Index_KMP(sstring T,sstring P,int next[]){
int i=0,j=0;
while((i<strlen(T))&&(j<strlen(P))||j==-1){
//question:j=-1为什么必须特别判断??? 不加特别判断就会在j=-1的时候跳出循环
if(j==-1||T[i]==P[j]){
i++;
j++;
}else{
j=next[j];
}
}
return i-strlen(P);
// if(j>=strlen(P)) return i;
// else return 0;
}
int main(void){
gets(T);
gets(P);
int next[maxsize];
Get_next(P,next);
printf("%d",Index_KMP(T,P,next));
// int i;
// for(i=0;i<strlen(P);i++){
// printf("%d ",next[i]);
// }
return 0;
}