KMP算法解析
void GetNext(char subStr[], int next[])
{
int i = -1;
int n = 0;
int count;
count = strlen(subStr);
next[0] = -1;
while (n<count)
{
if (i==-1 || subStr[n] == subStr[i])
{
n++;
i++;
if (subStr[n] == subStr[i])
next[n] =next[i];
else
next[n] = i;
}
else
i = next[i];
}
}
int IndexKMP(char objectStr[], char subStr[],int next[], int pos)
{
int i, n;
int objLength, subLength;
objLength = strlen(objectStr);
subLength = strlen(subStr);
for (n = pos, i = 0;n < objLength && i < subLength;)
{
if (i<0 || objectStr[n] == subStr[i])
{
i++; n++;
}
else
{
i = next[i];
}
}
if (i == subLength) return n - subLength;
else return -1;
}
#include <iostream>
#define Length 50
void GetNext(char subStr[], int * next);
int IndexKMP(char objectStr[], char subStr[], int next[], int pos);
int main()
{
char objectStr[Length];
char subStr[Length];
int next[Length];
scanf_s("%s", objectStr, Length);
scanf_s("%s", subStr, Length);
GetNext(subStr, next);
printf_s("%d\n", IndexKMP(objectStr, subStr, next, 5));
}
代码下载