1、kmp理解的核心
出现next数组设计从1开始与C语言程序默认从0开始,程序失败的问题,进行改造。。。
next[]的核心:p1-----pk-1 = Si-k+1-------Si-1;
P1------Pk-1 = Pi-k+1 -----Pi-1;
1231234
123
因为模式串与主串的已经匹配的部分是相同的,只要要考虑模式串的前面的部分与后面的部分相匹配。
前123与后123相匹配:
1.主串的指针的位置不变
2.模式串可以直接从第四个开始。
2、成功运行
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4804bd3dd6824fad23fede05735d0b6f.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a8adfd66bd76cbead7102728e112ef4c.png)
3、C语言代码实现:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern int strStr(char *x, char *y);
extern int indexKMP(char *x, char *y, int z);
int main()
{
char *haystack = "hello";
char *needle = "ll";
int result = strStr(haystack, needle);
return result;
}
int strStr(char *haystack, char *needle)
{
int j = indexKMP(haystack, needle, 0);
return j;
}
int *getnext(char *T)
{
int length = strlen(T);
int *next = (int *)malloc((length + 1) * sizeof(int));
int i = 0;
next[0] = -1;
int j = -1;
while (i < length - 1)
{
if (j == -1 || T[i] == T[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
int indexKMP(char *S, char *T, int pos)
{
int lengths = strlen(S);
int lengtht = strlen(T);
int *next = getnext(T);
int i = 0;
int j = 0;
while (i < lengths && j < lengtht)
{
if (j == -1 || S[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j == lengtht)
{
printf(" ===== %d", i - lengtht);
return i - lengtht;
printf(" ===== %d", i - lengtht);
}
else
return -1;
}