详细理解看这里:http://kb.cnblogs.com/page/176818/

   或者这里:http://blog.csdn.net/yutianzuijin/article/details/11954939

next[]数组的意义是“除自身外的最大重复子串”。

next数组计算:

理解了kmp算法的基本原理,下一步就是要获得字符串f每一个位置的最大公共长度。这个最大公共长度在算法导论里面被记为next数组。在这里要注意一点,next数组表示的是长度,下标从1开始;但是在遍历原字符串时,下标还是从0开始。假设我们现在已经求得next[1]、next[2]、……next[i],分别表示长度为1到i的字符串的前缀和后缀最大公共长度,现在要求next[i+1]。由上图我们可以看到,如果位置i和位置next[i]处的两个字符相同(下标从零开始),则next[i+1]等于next[i]加1。如果两个位置的字符不相同,我们可以将长度为next[i]的字符串继续分割,获得其最大公共长度next[next[i]],然后再和位置i的字符比较。这是因为长度为next[i]前缀和后缀都可以分割成上部的构造,如果位置next[next[i]]和位置i的字符相同,则next[i+1]就等于next[next[i]]加1。如果不相等,就可以继续分割长度为next[next[i]]的字符串,直到字符串长度为0为止。

字符串匹配:

计算完成next数组之后,我们就可以利用next数组在字符串O中寻找字符串f的出现位置。匹配的代码和求next数组的代码非常相似,因为匹配的过程和求next数组的过程其实是一样的。假设现在字符串f的前i个位置都和从某个位置开始的字符串O匹配,现在比较第i+1个位置。如果第i+1个位置相同,接着比较第i+2个位置;如果第i+1个位置不同,则出现不匹配,我们依旧要将长度为i的字符串分割,获得其最大公共长度next[i],然后从next[i]继续比较两个字符串。

字符串是从0开始的 Next数组是从1开始的

void GetNext(char *T){int j = 0;int Tlen = strlen(T));for(int i = 1; i< Tlen; i++){j = next[i];while (j && T[i] != T[j]) j = next[i];if(T[j] == T[i]) next[i+i] = j+1;}
}

void KMP(char *S,char *T){int j = 0;int Slen = strlen(S);int Tlen = strlen(T);for(int  i = 0 ; i < Slen; i++){while (j && S[i] != T[j]) j = next[j];if(S[i] == T[j]) j++;if(j == Tlen){j = next[j];}}
}

转载于:https://www.cnblogs.com/yoyo-sincerely/p/5259952.html

KMP算法(快速模式匹配)相关推荐

  1. KMP算法——快速求失效函数值及其代码实现

    前缀和后缀的最大相等长度 为了更好的理解我接下来所说的回溯值的求法,这里先介绍一下,如何求一个字符串的前缀和后缀相等的最大长度,为了便于说明记为k. 注意:前缀和后缀不能为字符串本身!!!!!! 如字 ...

  2. KMP算法字符串模式匹配

    KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算 ...

  3. KMP算法(快速找出字串)

    核心:通过寻找公共前后缀找出next数组 前后缀: 前缀:以第一个字母开头,但不包含最后一个字母 后缀:以最后一个字母结尾,但不包含第一个字母 注:若当前字符的前一位的最长公共前后缀(len)为2,则 ...

  4. 【数据结构与算法基础】模式匹配问题与KMP算法

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  5. 字符串的模式匹配,KMP算法

    KMP算法是模式匹配的一种改进的算法,所谓的模式匹配也就是对于两个字符串主串S和模式串T.从主串的S的pos个字符起和模式串中的第一个字符进行比较,如果相等,则继续比较后面的字符,否则从主串的下一个字 ...

  6. 【gif图文】KMP算法(从暴力匹配到快速匹配)

    从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...

  7. KMP算法--字符串模式匹配算法

    今天看到第四章<串>了,其中我觉得花的时间多一点的值得我写篇随笔的知识点就是:4.3 串的模式匹配算法:书上介绍了两种字符串匹配算法,一种是最简单最容易想到的逐个字符匹配算法(时间复杂度在 ...

  8. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  9. 1道动态规划(搬箱子)、KMP算法、图(Prim算法)、1道哈夫曼树

    1.最长递增子序列 华华要给厂里进一批新箱子共n个(n<=500),编号为1到n,用一个正整数ai(1<=ai<=10000)(1<=i<=n)来表示编号为i的箱子的高度 ...

  10. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

最新文章

  1. java 二进制模块_深入Node模块Buffer-学会操作二进制
  2. 利用查找替换批处理(附完整源码),进行高效重构
  3. tomcat启动慢_Hack下mongodb jdbc driver启动慢
  4. EFCore之命令行工具
  5. 【bzoj4025】二分图 LCT
  6. 我做的两个游戏的免CD补丁
  7. git 本地代码到远程库
  8. 向楚留香学习交朋友的办法
  9. 设计FMEA步骤五:风险分析
  10. html 多选框 下拉,一个模拟html下拉多选框的原生实现.
  11. 中国最爱喝奶茶的城市找到了
  12. STM32/GD32 IAP/Bootloader升级APP研究以及编程实现、hex文件格式
  13. Swift 读标准库源码笔记 -- Integers(基本数据类型篇)
  14. 剑与家园服务器维护,《剑与家园》杀鸡取卵式运营 如何拯救短命的区服?
  15. antv图形二次渲染刷新问题
  16. visio-软件设计的各种图
  17. 程序员都会的五大算法之三(贪心算法),恶补恶补恶补!!!
  18. 第四章-linux内核裁剪与移植
  19. python 偏函数_详细介绍Python中的偏函数
  20. ISP PIPLINE (一) BLC 以及 线性化

热门文章

  1. pythonista_Pythonista20190325伤不起
  2. esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
  3. springboot 上传文件解析入库_SpringBoot + easyexcel + WebUploader 实现文件上传并解析
  4. 计算机网络段标试卷,计算机网络基础-段标-第2章.ppt
  5. python实现dem输出三维模型_python DEM数据可视化
  6. HTML+CSS+JS实现 ❤️基于Javascript简单计算器特效❤️
  7. 大学计算机一级b笔记,全国计算机等级一级B Excel考试整理笔记
  8. Java 分割字符串
  9. ajax离开页面方法,如果用户在页面加载完成之前离开页面,则触发jQuery ajaxError()处理程序...
  10. 没有bug队——加贝——Python 练习实例 3,4