KMP算法是在已知模式串的next函数值的基础上执行的,所以必须先求出模式串的next数组值。
具体原理可以参考视频讲解:https://www.bilibili.com/video/av21828275/?p=39
实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 255
typedef unsigned char SString[MAXSIZE + 1]; //0号用来存放串的长度
void Get_Next(SString T,int *next)
{
int i = 1; //初始化i表示后缀
int j = 0; //初始化j表示前缀
next[1] = 0;
while( i < T[0] )
{
if( j == 0 || T[i] == T[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}
int main()
{
int i = 1;
SString T = " abaabcac";
T[0] = 8; //存放串长
int next[8];
printf("模式串:%s",T);
Get_Next(T,next);
printf("\nnext数组的值为:");
for(i = 1; i <= 8; i++ )
printf(" %d",next[i]);
printf("\n");
return 0;
}
n