不知道怎么插入公式,直接贴图了。。。
附上源代码如下,错误之处,望请指正!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_next_value(char *str, int len, int *next_value){
int i = 1, j = 0;
next_value[0] = 0;
while(i < len){
if(str[i] != str[j]){
next_value[i] = j;
while(j && str[i] != str[j]){
j = next_value[j];
}
}
else{
next_value[i] = next_value[j];
j++;
}
i++;
}
}
int kmp_search(char *str, int slen, char *pstr, int plen, int *next_value){
int si = 0, pi = 0;
if(plen > slen) return -1;
while(si < slen){
if(str[si] == pstr[pi]){
si++, pi++;
if(pi == plen){
return si - plen;
}
}
else{
if(pi == 0){
si++;
}
else
pi = next_value[pi];
}
}
return 0;
}
int main(int argc, char **argv){
if(argc < 3){
printf("usage: *.exe pattern string\n");
return -1;
}
char *pattern = argv[1];
char *string = argv[2];
int *next_value = (int*)malloc(4 * strlen(pattern));
int off;
get_next_value(pattern, strlen(pattern), next_value);
printf("\n");
off = kmp_search(string, strlen(string), pattern, strlen(pattern), next_value);
printf("%s\n", string + off);
free(next_value);
return 0;
}