#include <stdio.h>
void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int index_KMP(char str[], char pat[])
{
int i = 0;
int j = 0;
int next[255];
getNext(pat, next);
while (str[i])
{
if (pat[j] == '\0')
{
return (i - j);
}
if (str[i] == pat[j])
{
i++;
j++;
continue;
}
i += next[j+1]+1;
}
if (pat[j] == '\0')
{
return (i - j);
}
return -1;
}
//在原书中数组是从1开始的,所以导致直接抄写不可能的到正确结果
void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int index_KMP(char str[], char pat[])
{
int i = 0;
int j = 0;
int next[255];
getNext(pat, next);
while (str[i])
{
if (pat[j] == '\0')
{
return (i - j);
}
if (str[i] == pat[j])
{
i++;
j++;
continue;
}
i += next[j+1]+1;
}
if (pat[j] == '\0')
{
return (i - j);
}
return -1;
}
//在原书中数组是从1开始的,所以导致直接抄写不可能的到正确结果