下标从1开始
next数组
p串:ababa
ne值:00123
第i位的值的意思是以第i位结尾的子串与开头的串最长匹配的长度。
注意:算next时下标从2开始遍历,ne[1]=0固定,表示第一个发生失配时,再次匹配时已经匹配的串的长度为0。
计算next数组代码
for (int i = 2, j = 0; i <= n; ++i) {
while (j && p[j + 1] != p[i]) j = ne[j];
if (p[j + 1] == p[i]) j++;
ne[i] = j;
}
KMP匹配过程
从头开始遍历待匹配串
KMP计算过程代码实现
for (int i = 1, j = 0; i <= m; ++i) {
while (j && p[j + 1] != s[i]) j = ne[j];
if (p[j + 1] == s[i]) j++;
if (j == n) {
printf("%d ", i - n);
j = ne[j];
}
}
只需清楚 j 的含义, j 的值表示当前模式串p已经匹配完成了的位数。开始为0,为n时表示已全部匹配完成。
p = abac
s = ababac
当i=4时发生失配,此时j=3表示前3个字符已经匹配,由于发生失配,故令j=ne[j],ne[3]=1,j=1,此时表示现在前1个字符已经匹配,下个循环判断第j+1=2个字符是否匹配即可。