参考: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. java实现定时任务解决方案

    在线corn表达式 1. 总结常见的实现定时任务的几种方法 thread实现 [原理:通过创建一个线程,让他在while循环里面一直运行,用sleep() 方法让其休眠从而达到定时任务的效果.] Ti ...

  2. 9.[完]其他常用的rabbitmq的参数和设置

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-08-12 20:42:25 星期一 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  3. IFIX 数据源 节点 标签 域名

    一个动画,前景颜色 数据源如上图 点 ,,, 进入选择界面,如下 Fix32  应该是统一的前缀,自动添加上的 然后就是我们的节点名字,启动ifix的时候显示的那个节点名字 标签应该就是我们的 变量/ ...

  4. website url spam

    website url spam xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  5. export excel

    export excel sheet.js https://sheetjs.com/ https://github.com/SheetJS/sheetjs excel.js https://www.n ...

  6. flutter sqlite持久化数据

    dependencies: path: sqflite: sqflite_common_ffi: import 'dart:io'; import 'package:flutter/material. ...

  7. Flutter: IntrinsicWidth类,将孩子的宽度调整为孩子的最大内在宽度

    文档 原文 class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePage ...

  8. VOR/DME程序进近、复飞保护区的绘制

    今天尝试画一个典型的VOR/DME进近程序保护区. 读图 某机场VOR/DME进近程序平面图部分如下图所示:   该程序剖面图部分如下图所示:   分析 该机场采用了偏置导航台布局(导航台在机场内), ...

  9. K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

    一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...

  10. 03_MySQL重置root密码

    重设root密码