在KMP模式匹配中通过next的值可以快速达到匹配目的,那next的值怎么计算呢?

其实计算next的值本身也就是对模式串进行模式匹配,我们一起看看计算next的值的过程;

当模式串 P=“ababcabaababb” 时计算它的next值。

比如:

代码:

void get_next(m_1 A)
{int i=-1,j=0;A->next[0]=-1;   //next[0]为-1,你们可以默认加一,原因我在下面解释while(j<strlen(A->mel))   {if(i==-1 || A->mel[i]==A->mel[j])  //当i=-1(默认加一)或前缀子串和后缀字串等于{i++;j++;A->next[j]=i;}else i=A->next[i];}}

i从-1开始的原因:

有些书为了方便理解把模式串的第一个字串的下标设为1,但事实上字符串的第一个字符下标为0

完整代码:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 100
typedef struct N{char hel[MAXSIZE];int hel_size;
}*n_1,n_2;
typedef struct M{char mel[MAXSIZE];int mel_size;int next[MAXSIZE];int nextval[MAXSIZE];
}*m_1,m_2;void get_next(m_1 A);
void get_nextval(m_1 A);
void print(m_1 A);
m_1 create_n_m();
main()
{m_1 A=create_n_m();scanf("%s",A->mel);printf("%s %d\n",A->mel,strlen(A->mel)); get_next(A);get_nextval(A);print(A);
}m_1 create_n_m()
{m_1 P=(m_1)malloc(sizeof(m_1));
//  n_1 Q=(n_1)malloc(sizeof(n_1));return P;
}void get_next(m_1 A)
{int i=-1,j=0;A->next[0]=-1;   //next[0]为-1,你们可以默认加一,原因我在下面解释while(j<strlen(A->mel))   {if(i==-1 || A->mel[i]==A->mel[j])  {i++;j++;A->next[j]=i;}else i=A->next[i];}}void get_nextval(m_1 A)
{int j=1;A->nextval[0]=-1;while(j<strlen(A->mel)){if(A->mel[j]==A->mel[A->next[j]]){A->nextval[j]= A->nextval[A->next[j]];}elseA->nextval[j] = A->next[j];j++;}
}
//ababcababaababb
//ababcabaababbvoid print(m_1 A)
{int i;printf("\n"); for(i=0;i<strlen(A->mel);i++)printf("%c  ",A->mel[i]);printf("\n");for(i=0;i<strlen(A->mel);i++)printf("%d  ",A->next[i]+1);printf("\n");for(i=0;i<strlen(A->mel);i++)printf("%d  ",A->nextval[i]+1);
}

计算nextval,每一次比较时,当前位的字符和当前位置的字符的next值对应的字符进行比较,由于时间原因在这里我就不解释了,如果不懂私聊我或者在评论区提问,我会尽量解释清楚。

数据结构字符串模式匹配中计算next和nextval的值(C语言)相关推荐

  1. python读取路径中字符串_python实现提取str字符串/json中多级目录下的某个值

    字符串多级目录取值: 比如说: 你response接收到的数据是这样的. 你现在只需要取到itemstring 这个字段下的值.其他的都不要! 思路就是:字符串是个json格式(或转为json格式), ...

  2. python层级抓取_python实现提取str字符串/json中多级目录下的某个值

    字符串多级目录取值: 比如说: 你response接收到的数据是这样的. 你现在只需要取到itemstring 这个字段下的值.其他的都不要! 思路就是:字符串是个json格式(或转为json格式), ...

  3. 数据结构 KMP算法中next数组与nextval如何求

    个人学习用,比较杂乱. 一.例题 二.题目(3)next解法见图 三. nextval如何求解? 3.1步骤一:画图,先求出next 3.2 位置1的数必定为0,记住即可 位置2的next为1,所以要 ...

  4. python阈值计算_python – 在numpy中计算超过阈值的数组值的最快方法

    使用cython可能是一个不错的选择. import numpy as np cimport numpy as np cimport cython from cython.parallel impor ...

  5. c语言中变量r存放当前n值,C语言课件(王曙燕)chp3 算法和基本程序设计.ppt

    <C语言课件(王曙燕)chp3 算法和基本程序设计.ppt>由会员分享,可在线阅读,更多相关<C语言课件(王曙燕)chp3 算法和基本程序设计.ppt(39页珍藏版)>请在人人 ...

  6. KMP快速计算next与nextval

    最近在研究数据结构,碰到了计算next与nextval值,查看了大量资料,发现这个方法最是清楚明白,整理后贡献出来,有问题可以留言哟! 方法1:引入了一个maxL,在计算nextval时,比较方便.强 ...

  7. 根据身高体重计算某个人的BMI值--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)

    实例3:根据身高体重计算某个人的BMI值 BMI又称为身体质量指数,它是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准.我国制定的BMI的分类标准如表1所示. 表1  BMI的分类 BMI 分类 ...

  8. 数据结构---BF字符串模式匹配

    数据结构-BF字符串模式匹配 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> int BF(char * S, cha ...

  9. 数据结构之字符串模式匹配

    程序源代码:点击打开链接 1.引入 字符串模式匹配.首先我们引入目标串,模式串的概念,而字符串模式匹配就是查找模式串在目标串中的位置. 2.brute-Force算法 brute-Force算法,我的 ...

最新文章

  1. mqtt 传文件断开连接的原因_mqtt 发送消息断开链接
  2. day04 JDBC java数据库连接
  3. Leaflet中使用awesome-markers插件显示带图标的marker
  4. Scala教程之:Scala基础
  5. merge into on多个条件_“京沪二线”贯穿山东半岛,沿线多个城市将受益,来了解一下吧...
  6. 60佳优秀的 Photoshop 网页制作教程【下篇】
  7. 你真的懂js获取可视区宽高吗
  8. 三张图搞懂JavaScript的原型对象与原型链
  9. 按shift键调出命令行的脚本
  10. 微信小程序的剪贴板 +复制剪贴,在淘宝中打开就可以获取到商品
  11. Fiddler中文乱码
  12. CAD中 OLE不能旋转_工作常备的天正CAD技巧都在这里啦(附教程)
  13. Web开发后端框架比较
  14. 【数据结构(郝斌)】01-数据结构概述
  15. 服务器没有显示器能接笔记本吗,笔记本能连显示器吗_笔记本能不能接显示器...
  16. 两个鸡蛋和一百层楼的问题
  17. 从零开始的数模学习(4):熵权法(评价类模型)
  18. 利用opencv3中的kmeans实现抠图功能
  19. JAVA:实现Juggler Sequence杂耍者序列算法(附完整源码)
  20. 回忆,这一年(华师918血泪贴)

热门文章

  1. 孤岛效应_打破那些云安全孤岛
  2. 你在B站弹幕玩过哪些梗?
  3. c语言打印杨辉三角七阶,C语言实现:打印杨辉三角
  4. 用python让excel飞起来 pdf_这10款良心又好用的PC小工具,让你的电脑更好用!亲测强力推荐!...
  5. 欧美金唱盘专辑 -超级巨星代表作70首
  6. 2014-百度 阿里 华为笔试题
  7. O2O:中国地图行业新机遇
  8. PCI5565 PCI-5565 PMC5565 VMIC5565 反射内存 反射内存卡 GE反射内存
  9. 小米手机如何设置默认浏览器,这2个方法值得收藏
  10. STM32 I2C HAL库读取HTU21D