KMP原理:通过一个数组存储部分匹配信息;减少多余的比较。
#include<stdio.h>
#include<string.h>
#define N 50
void init_str(char t[], int next[]) //首先在主函数初始化next为0
{
int i = 2,k=0;
next[0] = -1;
while (i < strlen(t))
{
for (k = i - 1; k > 0; k--) //设置循环次数
{
int signal = 1;
int m = 0,n=i-k;
for(;m<k; m++, n++)
if (t[m] != t[n]) { signal = 0; break; } //只要有一个不相等就退出循环
if (signal) { next[i] = k; break; }
}
i++;
}
}
int kmp(char s[], char t[],int next[])
{
int i=0, j=0;
while (i < strlen(s) && j < strlen(t))
{
if (s[i] == t[j])
{
i++; j++;
}
else j = next[j];
}
if (j == strlen(t) ) return (i - j); //存在字串返回开始位置(数组下标)
else return -1; //不存在子串返回-1
}
int main()
{
char s[N] = "aaaaab";
char t[N] = "aaab";
int next[N] = { 0 };
init_str(t, next);
printf("%d", kmp(s, t, next));
return 0;
}