KMP算法
KMP算法:简单理解就是在一个串(主串)中找另一个串(模式串)出现的位置。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getNext(char* t, int next[])//求next数组
{
int len = strlen(t);
int j = 1;
int k = 0;
if (len == 0)
{
return;
}
next[0] = -1;
if (len > 1)
{
next[1] = 0;
while (j < len - 1)
{
if (k == -1 || t[k] == t[j])//k为-1表示 所有都匹配完成 而且没有任何的最大前缀和最大后缀
{
next[j + 1] = k + 1;
j++;
k++;
}
else
{
k = next[k];//kmp回退
}
}
}
}
void ShowNext(int next[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", next[i]);
}
printf("\n");
}
int KMP(char* s, char* t)
{
int slen = strlen(s);//主串的长度
int tlen = strlen(t);//模式串的长度
int i = 0;//i 主串的下标
int j = 0;//j 模式串的下标
//int next[7] = { -1, 0, 0, 0, 1, 2, 3 };
int* next = (int*)malloc(sizeof(int)*tlen);
getNext(t, next);
ShowNext(next, tlen);
while (i < slen && j < tlen)//主串没有匹配完成 字串没有匹配完成
{
if (j == -1 || s[i] == t[j])//j = -1;
{
i++;
j++;
}
else
{
j = next[j];
}
}
free(next);
if (j == tlen)
{
return i - tlen;
}
return -1;
}
int main()
{
char* t = "ABABCCABAD";
int next[10];
getNext(t, next);
ShowNext(next, 10);
return 0;
}