这个KMP算法效率有点问题。有个地方又回溯了~Find out and fix it.
>> >>>>>>>>>>Okey。小哥,怎么样了?哥们写得一手好字啊~
这是修正后的代码:
voidkmpNextEx(char *pattern, int *next, int len) {
int i = 1;
int j = -1;
next[0]= -1;
while(i < len) {
if(j == -1 || pattern[i - 1] == pattern[j]) {
/* 注意这里:如果发现与上一次匹配的值相同,则直接将上一次匹配的值赋予给新的
* next[i],这样可以改进如果Pattern有重复字符出现的情况
*/
if(pattern[i - 1] != pattern[j - 1]) {
next[i]= j + 1;
}else {
next[i]= next[j];
}
++j;
++i;
}
else {
j= next[j];
}
}
}
图片
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
voidkmpNext(char*, int*, int);
intkmpIndexOf(char*, char*);
intbfIndexOf(char*, char*);
int main(int argc, char*argv[]) {
char *s1 = "2aaaaaaaaaaaaaaasdfasdf134123asdffffffo1asd1234\
ffffasdf213fvzazxcnvjklnaskld./zca;sdjkfjaiou21o3elan'[ \
123454154sa4df6548210ykzht4341bwasd1231234239r \
4sauioj9j91u8hdjkadu9891nkjklfau12 \
134j0zhcjkvuiuizuionvjjksanfjih2bjkbmzjkxvhiannzjkvjkla \
4=01293=0ykzht4341bwasd123123423l";
char *pat = "0ykzht4341bwasd123123423l";
char *answer = (char*)malloc(sizeof(pat) + 1);
printf("Patter:\t%s\n", pat);
printf("%-20s%d\n", "ByKMP:", kmpIndex(s1, pat));
strncpy(answer,s1 + kmpIndex(s1, pat), strlen(pat));
answer[strlen(pat)]= '\0';
printf("Answer:\t%s\n", answer);
getchar();
return 0;
}
intkmpIndex(char *strsrc, char*pattern) {
int *next = (int*)malloc(sizeof(int) *strlen(pattern));
int strsrcLen = strlen(strsrc);
int patLen = strlen(pattern);
int i = 0;
int j = 0;
kmpNext(pattern,next, strlen(pattern));
while(i < strsrcLen && j < patLen) {
if(j == -1 || strsrc[i] == pattern[j]) {
//printf("%d\n", i);
++i;
++j;
}
else {
j= next[j] - 1;
}
}
if(j >= patLen) {
return i - patLen;
}
else {
return -1;
}
}
voidkmpNext(char *pattern, int*next, int len) {
int i = 2;
int j = 1;
int count = 0;
next[0]= 0;
next[1]= 1;
while(i < len) {
j= 0;
count= 0;
while(pattern[j] == pattern[i - j - 1] && j< i - 1) {
count++;
++j;
}
if(count == 0) {
count= 1;
}
next[i]= count;
++i;
}
}