KMP学习总结体会(原创!拒绝复制粘贴)
看《大话数据结构》里面有关于字符串搜索算法KMP, 自己实验了书上的代码也不太正常,可能是我的问题,期待各位小伙伴验证。
看了好多网上的好文我才明白究竟是怎么回事。原因估计就是我比较菜吧~
KMP算法
这里推荐一篇知乎上的文章,里面有动图对于原理理解特别棒。
labuladong的算法专栏 - KMP 算法详解
还有一篇csdn的大佬的文章
从头到尾彻底理解KMP(2014年8月22日版)- v_JULY_v
这篇文章的代码全部好用,里面十分详尽的介绍了kmp算法以及相关的拓展算法。十分推荐看看。
还有就是万恶的《大话数据结构》。我也是纳闷了为啥我抄书代码跑出来不对~
就是141页生成next数组的代码。大家也可以试试。
最后就是贴一下自己理解后的代码。好多抄csdn大佬的。我的代码也是跑过没啥大问题的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void kmp(char* p,int next[])
{
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1)
{
if (k == -1 || p[j] == p[k])
{
++k;
++j;
if(p[j] != p[k])
next[j] = k;
else
next[j] = next[k];
}
else
{
k = next[k];
}
}
}
int str_sreach(char *s1, char *s2)
{
int *num_space = NULL;
int s1_length = strlen(s1);
int s2_length = strlen(s2);
int i = 0, j = 0;
num_space = (int *)malloc(s2_length * sizeof(int));
memset(num_space, 0, s2_length * sizeof(int));
kmp(s2, num_space);
while(i < s1_length && j < s2_length){
if( j == -1 || s1[i] == s2[j]){
i++;
j++;
}
else{
j = num_space[j];
}
}
if(j == s2_length){
return i - j;
}
return -1;
}
int main()
{
int res = 0;
char str1[] = "abcabx";
char str2[] = "dasdfilkjsdfkljvnasklfjewiabcagshjabcabx";
res = str_sreach(str2, str1);
printf(" %d \n", res);
}