KMP算法
来源:互联网 发布:网络直播 yy 编辑:程序博客网 时间:2024/05/01 19:38
void gen_next(char *q, int next[]) { int len = strlen(q); next[0] = 0; //next数组第一个元素为0int 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;}