关于KMP算法中,获取next数组算法的理解
Posted Blue_Keroro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于KMP算法中,获取next数组算法的理解相关的知识,希望对你有一定的参考价值。
参考:KMP入门级别算法详解--终于解决了(next数组详解)
https://blog.csdn.net/lee18254290736/article/details/77278769
在这里讨论的next数组的含义为模式串p[j]之前前缀和后缀相等的个数,若都不相等则为0。(特殊情况,没有前缀和后缀时,则为-1,如next[0]=-1;当j==1时,p[1]前面只有一个字符,在这里认为next[1]=0)
以下是计算next数组算法的代码:
void getNext(char *p, int *next) { int j=0, k=-1; next[0] = -1; while (j<strlen(p) - 1) { if (k == -1 || p[j] == p[k]) { ++j; ++k; next[j] = k; } else k = next[k]; } }
对以上代码的解析:
首先,k 始终代表着模式串中当前j对应的p[j]之前前缀和后缀相等的个数,因此p[j] == p[k]时
++j; ++k; next[j] = k;
当p[j] != p[k],则
k = next[k];
此时k 依然代表着模式串中当前j对应的p[j]之前前缀和后缀相等的个数,只不过个数变少了,例如p[j]之前的字符串为acac.....acac,p[j]之前前缀和后缀相等的个数为4,则k=next[4]=2,则可视为ac.........ac。当p[j]还是不等于p[k]时,再次执行
k = next[k];
直至它们相等,或k==-1。当k==-1时,必定执行if语句中的代码,使得当前next[j]=0。
以上就是对获取next数组算法的理解。
配合以下代码实现KMP算法:
int kmp(char* W,char* T,int* next){ int i = 0, j = 0; while (i<strlen(T)){ while (j != -1 && W[j] != T[i]){ j = next[j]; } if (j == strlen(W)-1){ return i - strlen(W) + 1; } else{ j++; i++; } } return -1; }
以上是关于关于KMP算法中,获取next数组算法的理解的主要内容,如果未能解决你的问题,请参考以下文章
KMP算法详细解释,带你理解k=next[k](逐代码分析)
KMP算法详细解释,带你理解k=next[k](逐代码分析)