总归不是很好懂的,需要注意不同人在实现时对next数组的定义可能不同。
学习时大概要分3步:了解KMP算法流程和大致原理,理解next数组的求解,理解代码实现。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void get_next (int *next, const char *t)
{
int k = -1;
next[0] = -1;
for (int i = 0; i < strlen (t) - 1 ;) {
if (k == -1 || t[i] == t[k]) {
++i;
++k;
next[i] = k;
} else {
k = next[k];
}
}
}
int KMP (const char *s, const char *t)
{
const int lenS = strlen (s);
const int lenT = strlen (t);
int next[lenT];
get_next (next, t);
int i = 0;
int j = 0;
while (i < lenS && j < lenT) {
if (j == -1 || s[i] == t[j]) {
++i;
++j;
} else {
j = next[j];
}
}
if (j == strlen (t))
return i - j;
else
return -1;
}
参考资料
真正把kmp算法中的next数组含义和求法讲明白
《大话数据结构》
最浅显易懂的 KMP 算法讲解
【天勤考研】KMP算法易懂版