kmp 小程序
void caculateNext(const char* p, int len, int* next)
{
if(p == NULL || strlen(p) != len )
{
return;
}
memset(next, 0, len*sizeof(int));
next[0] = -1;
int i = 2, k;
while(i<len)
{
for(k=next[i-1]; k != -1; k = next[k])
{
if(p[k] == p[i-1])
{
next[i] = next[i-1] + 1;
break;
}
}
i++;
}
}
const char* kmp(const char* str, const char* pattern)
{
if(str == NULL || pattern == NULL || strlen(pattern) > strlen(str))
return NULL;
int len = strlen(str);
int patternlen = strlen(pattern);
int* next = new int[patternlen];
caculateNext(pattern, patternlen,next);
int i=0, j= 0;
while(i<len && j<patternlen)
{
if(j == -1 || str[i]==pattern[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j >= patternlen)
return &(str[i-j]);
return NULL;
}