参考: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数组算法的理解的更多相关文章

  1. KMP 算法中的 next 数组

    KMP 算法中对 next 数组的理解 next 数组的意义 此处 next[j] = k:则有 k 前面的浅蓝色区域和 j 前面的浅蓝色区域相同: next[j] 表示当位置 j 的字符串与主串不匹 ...

  2. KMP算法中求next数组的实质

    在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...

  3. kmp算法中的next数组实例解释

    假设求串′ababaaababaa′的next数组 模式串 a b a b a a a b a b a a 下标 1 2 3 4 5 6 7 8 9 10 11 12 1.前两位:next数组前两位一 ...

  4. KMP算法中的next数组求解示意图

  5. 数据结构KMP算法中手算next数组

    总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以 ...

  6. KMP算法中我对获取next数组的理解

    之前在学KMP算法时一直理解不了获取next数组的函数是如何实现的,现在大概知道怎么一回事了,记录一下我对获取next数组的理解. KMP算法实现的原理就不再赘述了,先上KMP代码: 1 void g ...

  7. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  8. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  9. JVM内存管理之GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

随机推荐

  1. Codeforces Round #650 (Div. 3) B. Even Array

    题目链接:https://codeforces.com/contest/1367/problem/B 题意 有一大小为 $n$ 的数组 $a$,问能否经过交换使所有元素与下标奇偶性相同(0 - ind ...

  2. 【noi 2.6_8787】数的划分(DP){附【转】整数划分的解题方法}

    题意:问把整数N分成K份的分法数.(与"放苹果"不同,在这题不可以有一份为空,但可以类比)解法:f[i][j]表示把i分成j份的方案数.f[i][j]=f[i-1][j-1](新开 ...

  3. 迪杰斯特拉+拆点 Deliver the Cake - HDU 6805

    题意: t组输入,给你n个点m条边.你需要输出从s点到t点的最短距离,然后是m条边,每条边输入信息为: a,b,c 表示从a点到b点的一个无向边长度为c 每一个点会有一个属性L.R或M 如果a和b一个 ...

  4. HDU 3537 Daizhenyang's Coin 翻硬币博弈

    题意: 给你n个硬币,你可以从中拿出来1.2.3个硬币,它们不一定要连续,你只需要保证拿出来的硬币中那个下标最大的硬币一定要是正面朝上,最后谁不能操作,谁就输了 题解: 翻硬币游戏 结论: 局面的SG ...

  5. universities

  6. redis持久化-AOF

    1.aof文件写入与同步 2.aof重写 重写的目的是为了减小aof文件的体积,redis服务器可以创建一个新的aof文件来代替现有的aof文件,新文件不会有冗余的命令. BGREWRITEAOF:遍 ...

  7. Petrozavodsk Winter Training Camp 2017G(栈)题解

    题意: \(M_i\)为一个\(m*m\)矩阵,已知 \[\begin{aligned} &M_0=A\\ &M_i=(\prod_{j=c_i}^{i+1}M_j)B \end{al ...

  8. mybatis(五)mybatis工作流程

    转载:https://www.cnblogs.com/wuzhenzhao/p/11103017.html 先来看一下MyBatis 的编程式使用的方法: public void testMapper ...

  9. 计蒜客 2019南昌邀请网络赛J Distance on the tree(主席树)题解

    题意:给出一棵树,给出每条边的权值,现在给出m个询问,要你每次输出u~v的最短路径中,边权 <= k 的边有几条 思路:当时网络赛的时候没学过主席树,现在补上.先树上建主席树,然后把边权交给子节 ...

  10. SSL/TLS All In One

    SSL/TLS All In One HTTPS SSL/TLS 的工作原理 https://www.websecurity.digicert.com/zh/cn/security-topics/ho ...