void BuildMatch(char* pattern, int* match)
{
int i, j;
int m = strlen(pattern);
match[0] = -1;
for (j = 1; j < m; j++)
{
i = match[j - 1];
while ((i >= 0) && (pattern[i + 1] != pattern[j]))
i = match[i];
if (pattern[i + 1] == pattern[j])
match[j] = i + 1;
else
match[j] = -1;
}
}
int my_strKMP(char *source, char *pattern)
{
if (source == NULL || pattern == NULL) return -1;
int lenSrc = strlen(source);
int lenPat = strlen(pattern);
int s, p, *match;
if (lenSrc < lenPat) return -1;
match = new int[lenPat];
BuildMatch(pattern, match);
s = p = 0;
while (s < lenSrc && p < lenPat)
{
if (source[s] == pattern[p])
{
s++;
p++;
}
else if (p > 0)
p = match[p - 1] + 1;
else
s++;
}
return (p == lenPat) ? (s - lenPat) : -1;
}