#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get_next(char *p, int len, int *next) {
int j = -1;
int i = 0;
next[i] = -1;
while(i < len - 1) {
if(j == -1 || p[i] == p[j]) {
++i;
++j;
if(p[i] != p[j]) {
next[i] = j;
} else {
next[i] = next[j];
}
} else {
j = next[j];
}
}
}
int kmp_search(char *text, int text_len, char *pattern, char pat_len, int *next) {
int j = 0;
int i = 0;
while(i < text_len && j < pat_len) {
if(j == -1 || text[i] == pattern[j]) {
++i;
++j;
} else {
j = next[j];
}
}
if(j >= pat_len)
return i - pat_len;
else
return -1;
}
void main() {
char text[] = "1101001010100001101000011";
char pattern[] = "01001010100001";
int text_len = strlen(text);
int pat_len = strlen(pattern);
int *next = (int*)malloc(sizeof(int) * pat_len);
memset(next, 0, sizeof(int) * pat_len);
get_next(pattern, pat_len, next);
int rst = kmp_search(text, text_len, pattern, pat_len, next);
if(rst != -1)
printf("%d\n", rst);
else
printf("not find yet!\n");
}
kmp算法源码-经过比较,这个源码的速度应该是移动最快的。
最新推荐文章于 2023-05-19 13:05:11 发布