判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法。
1.BF算法
int BF(char *s, char *p){ if(s==NULL || p==NULL)return -1; int i=0; int j; while(i<strlen(s)){ j=0; while(s[i]==p[j] && j<strlen(p)){ i++; j++; } if(j==strlen(p))return i-j; i=i-j+1; } return -1; }
2.KMP算法
KMP算法的原理有很多文章解释,这就不说了(我也看得不是很懂......)。整个KMP算法的关键点在于next数组的实现。
KMP算法主体:
int KMP(char *s, char *p){ if(s==NULL || p==NULL)return -1; int next[100]; get_next(next, p); int i=0; int j=0; while(i<strlen(s)){ if(j==-1 || s[i]==p[j]){ i++; j++; }else{ j=next[j]; } if(j==strlen(p))return i-j; } return -1; }
get_next函数的实现:
void get_next(int *next, char *p){ if(next==NULL || p=NULL)return; int i=0; int j=-1; next[0]=-1; while(i<strlen(p)-1){ if(j==-1 || p[i]==p[j]){ i++; j++; next[i]=j; }elseP{ j=next[j]; } } }
注意,get_next函数的实现只与子字符串有关系...
时间: 2024-10-24 23:30:24