void gen_next(char *q, int next[]) {
int len = strlen(q);
next[0] = 0; //next数组第一个元素为0
int k = 0;
for(int i=1; i<len; ++i) {
while(k > 0 && q[k] != q[i]) //此处k为next[i-1]的值。当q[i]!=q[k]且k可以往前走。
k = next[k]; //更新k
if(q[k] = q[i])
k++;
next[i] = k;
}
}
int find(char *s, char *q) {
int lens = strlen(s), lenq = strlen(q);
int si = 0, qi = 0;
int *next = malloc(sizeof(int)*lenq);
if(next == NULL)
exit(EXIT_FAILURE);
memset(next, 0, sizeof(int)*lenq);
gen_next(q, next);
int count = 0;
while(si < lens && qi < lenq) {
while(s[si] == q[qi] && si < lens && qi < lenq) {
si++, qi++;
}
if(qi == lenq) {
printf("found match at %d.\n", si-lenq);
count++;
qi = next[qi-1];
continue;
}
if(qi == 0) //第一个字母就不匹配
si++;
else
qi = next[qi];
}
free(next);
return count;
}
KMP算法
最新推荐文章于 2024-09-27 14:28:55 发布