又把KMP实现了一编,检查出来以前的一个错误
void getNext(char *p, int next[])
{
int len = strlen(p);
int i, j;
next[0] = 0;
for(i = 1; i < len; i++)
{
j = next[i-1];
while(j != 0 && p[j-1] != p[i-1])
j = next[j-1];
next[i] = j+1;
}
}
int kmp(char *T, char *P, int next[])
{
int lenA = strlen(T);
int lenB = strlen(P);
int i,j;
i = j = 0;
while(i < lenA)
{
if(j == -1 || T[i] == P[j])
{
i++;j++;
}
else
{
j = next[j] - 1;
}
if(j == lenB)
{
return i - j;
}
}
return -1;
}
int main()
{
char p[] = "0001";
char t[] = "211331000100000";
//printf("%s\n", nativeMatch(t,p));
int len = strlen(p);
int *next;
next = (int*)malloc(sizeof(int)*len);
getNext(p,next);
printf("%d\n", kmp(t,p, next));
free(next);
}