字符串匹配KMP
KMP过程其实就是去找下一个更好的状态的过程,省略去了中间穷举的无用过程,直接跳到下一个更好的状态,通过模式串本身的信息,站在模式串的角度来考虑问题

取长的一对

若想让模式串直接从Sk状态跳到Sk+1状态,那就要找到一个j使指针跳到那个状态,而主串中的i保持不变,也就是i不需要回溯(也就达到了省略Sk到Sk+1中间的那些无用的过程)
如何找到这个j呢,既然当不匹配时,要移动的j只与模式串有关,那么我们就可以提前通过模式串做好一张表,然后每次不匹配的时候就去找对应表里面的值,让j移动到该值所对应的位置,而i保持不变从而继续与主串匹配,这张表就是next[j]
关键问题就是去求next数组,下面给出了求next数组的方法,比较重要,可能在期末考试和考研中出现
首先画出一个三行的表,这里以模式串ABABABB为例
假如现在我们已经知道了"?"处的值,当模式串的第j个位置与主串的第i个位置不匹配的时候,我们就去找next[j]的值,让j等于next[j],然后再去和主串的i位置继续比较,所以只要知道了next这张表就OK了,下面具体看看如何建立这张表:
假设现在模式串与主串匹配时在j=6位置不匹配了如图1所示。那么我们首先要找一个F串,这里F串就是1-5对应的串"ABABA",也就是j=6前面的串,确定F串后,在F串的左右两端找到一对相等的串FL,FR,然后前移模式串使得FL与FR重合,如图2所示,移动后我们就可以看到应该从j=4开始继续与主串比较,换言之next[6]=4,同时,我们可以看到这个j值刚好是FR,FL的长度加1,于是得到图3的求next的手工算法,适合在考试时用,考研中可能会出现给你一个模式串让你写出它的next数组
图1

图2

图3

注意图3中的第一句话,当next[1]为0时,是特殊标记,表示应从模式串第一个字符与主串当前不匹配字符的下一个字符开始比较,这个时候就不同于其它情况,这里要动的是i了。
接下来具体写一下求解的过程
next[1]不用想了 就是0 固定的
当j=2,此时F串是2前面的串也就是"A",那么FR,FL的长度应该为0,所以next[2]=0+1=1,填入1;当j=3,F="AB",FR,FL的长度仍然为0,故next[3]=1;当j=4,F="ABA",此时FR=FL="A",长度是1,所以next[4]=2,注意虽然是从两端找字符串,但是字符串的顺序还是不变的,不能说"AB" = "BA";当j=5,F="ABAB",此时FR=FL="AB"=2,next[5]=3
当j=6,F="ABABA",FR=FL="ABA",next[6]=4;当j=7,F="ABABAB",FR=FL="ABAB",next[7]=5,求解完毕
代码实现与这里手工的有一点区别,这里我们是让j从1开始的,但是实际情况是数组下标往往从0开始,这时候在代码中就有一定的区别了,如下,next[1]仍然为0,next[0]为-1,并且next[j]=Len,不加1了。
void GetNext(string str, int *next)
{int j;next[0] = -1;next[1] = 0;for (j = 2; j < str.length(); j++){int left = 0, right = j - 1;int Len=0;while (left < j-1){int i, g,flag=1;for (i = 0,g=right; i <= left; i++,g++){if (str[i] != str[g]){flag = 0;break;}}if (flag == 1)Len = left + 1;left++;right--;}next[j] = Len ;}
}

转载于:https://www.cnblogs.com/Liu269393/p/10224023.html

字符串匹配KMP算法相关推荐

  1. kmp算法详解php,php中字符串匹配KMP算法实现例子

    KMP算法是一个比较高级的算法了,加了改进了,下面我们来在php中实现KMP算法,希望例子对各位同学会带来帮助哦. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J. ...

  2. C++实现字符串匹配KMP算法

    文章目录 1. 概述 2. 代码实现 3. 代码测试 1. 概述 Kmp算法的介绍及思想参阅下面两篇文章: 字符串匹配KMP算法 算法)通俗易懂的字符串匹配KMP算法及求next值算法 2. 代码实现 ...

  3. 字符串匹配 KMP算法

    问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置.一般处理这种问题往往采用简单粗暴的方法--暴力匹配法.所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹 ...

  4. 字符串匹配——KMP算法

    字符串匹配--KMP算法 ​ 字符串匹配是计算机编程中最常使用到的基础算法之一.字符串匹配相关的算法很多,Knuth-Morris-Pratt(KMP)算法是最常用的之一.最近在学习KMP算法,学习了 ...

  5. C语言实现字符串匹配KMP算法

    相信很多人(包括自己)初识KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,要么看不懂书上的解释,要么自己觉得好像心里了解KMP算法的意思,却说不出个究竟,所谓知其然不知其所以然是也. 字符 ...

  6. 【数据结构与算法】字符串匹配 KMP 算法

    单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 KMP 算法 KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris ...

  7. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  8. 字符串匹配KMP算法的理解(详细)

    1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. ...

  9. 字符串匹配——KMP算法【C语言】

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后 ...

最新文章

  1. 【CentOS 7LNMP架构33】,nginx负载均衡#180109
  2. 【7.6.3】基于每个具体类一张表的继承映射
  3. JavaScript中的函数
  4. 从技术走向管理的注意要点
  5. 前端面试-综合问题版
  6. python列表索引负数_python – 如何检查列表索引是否存在?
  7. python 获取Dmidecode 输出的系统硬件信息
  8. 是学习Java还是Python?一张图告诉你!
  9. 蓝桥杯2015年第六届C/C++省赛C组第九题-打印大X
  10. 大教堂与集市 The Cathedral The Bazaar -- 这是当代软件技术领域最重要的著作
  11. 查看安卓app包名的5种方法
  12. php免杀教程【绝对原创】
  13. 计算机硕士工资一览表 08年各大IT公司薪水行
  14. luogu P5560 [Celeste-B]Golden Feather
  15. 我在CSDN参与的3000个帖子
  16. 机器学习特征工程之特征缩放+无量纲化:非线性缩放(例如,sigmoid、tanh、arctan等)
  17. PCB 铜厚厚度和线宽的选择
  18. LS1046:挂载根文件系统
  19. [附源码]java毕业设计海雨市高校实验设备报修系统
  20. 地平线发布AI on Horizon战略,与首汽约车、禾赛科技分别达成战略合作 | 2019上海车展...

热门文章

  1. 《认知设计:提升学习体验的艺术》——学习者喜欢什么
  2. 交换机工作原理、MAC地址表、路由器工作原理详解
  3. Apache访问日志详解
  4. 配置发布和禁用复制功能时提示 分发服务器未正确安装。
  5. 自动禁止ssh的root登陆
  6. Nginx + Tomcat 负载均衡集群配置
  7. 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate...
  8. uboot、kernel和rootfs烧录
  9. Ubuntu 20.04上安装Git方法
  10. MongoDB的update和set的用法