相信通过今天的文章,你会对KMP的认识更加深入一层,不止停留在知道怎样计算的层面上了,废话不多说,開始。

通过前面的第一篇文章,知道了怎么求next数组,相信非常多喜欢刨根问底的人就会问,我依照你的做法确实可以解决问题,那么next数组究竟是个神马东西喃?为啥会那样求喃?

next数组为啥那样求?今天翻阅算法导论发现有证明next数组迭代计算的正确性,可以理解点,可是还不到可以写出来的程度,又把july的文章大致浏览下,想看看他是怎么介绍的,发现他把这部分也略过了,在文章最后说用了1年的时间才全然明确理解。看看如今的我,也还是处于尚未全然理解的程度,所以这部分(next数组的计算原因)决定暂且放下不写,释怀一段时间(预计会非常长,由于接下来时间会非常紧)后有精力再学习的时候加上。

     所以今天就说说,next数组究竟是个神马东西?
     本篇文章以 阮一峰 那篇文章的最后一部分開始,假设你不了解KMP或没看过我的第一篇KMP的文章,那最好先花5到10分钟先阅读也算是预热一下。
一、以"ABCDABD"为例,来了解下前缀,后缀:
  - "A"的前缀和后缀都为空集,共同拥有元素的长度为0;
  - "AB"的前缀为[A],后缀为[B],共同拥有元素的长度为0;
  - "ABC"的前缀为[A, AB],后缀为[BC, C],共同拥有元素的长度0;
  - "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共同拥有元素的长度为0;
  - "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共同拥有元素为"A",长度为1;
  - "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共同拥有元素为"AB",长度为2;
  - "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共同拥有元素的长度为0。

、next数组存储的是 模式串中 之前已经匹配的字符 的"前缀"和"后缀"的 最长的 共同拥有元素 的长度
     概念比較绕,注意我上面句子中使用了空格来帮助你理解,以下举个样例说下, 有模式串 T = "ABCDABD"
    
     在求next[j] 时候,我们如果T[0]--T[j-1]都可以匹配成功,这个如果是合理的,由于仅仅有每次匹配失败的时候才会使用next数组来获得下一次匹配開始的位置。
     上面的话 请多读几遍。
     好,我们来求next[1], 模式串中之前已经匹配的字符是T[0]= A, 在第一部分讲过他的前缀后缀都为空,共同拥有元素长度为 0 ,所以next[1]=0;
     求next[4], 模式串中之前已经匹配的字符是T[0]--T[3]={A, B, C, D}, 从第一部分得到他的前缀和后缀共同拥有元素长度为0,所以next[4] = 0;
     求next[5], 模式串中之前已经匹配的字符是T[0]--T[4]={A, B, C,D, A}, 从第一部分得到他的前缀和后缀共同拥有元素为'A', 长度为1, 所以next[5]=1;
     好了,其它的几个自己试着来推倒推倒。

三、next数组的还有一理解(对于学习后面的BM算法做一点点小小的铺垫)
     如果有一例如以下的匹配
     留意我图上颜色的两个AB,在D匹配失败的时候,next数组事实上做的就是让前面的AB移动到后面匹配的AB,例如以下图:
     这样来避免回溯,加快效率的。在我后面打算要介绍的BM算法中这样的出现的字符串叫做好字符串,哈哈,是不是又长知识了,好了,今天的介绍就到这里为止,这样KMP就算介绍完了。


假设你认为本篇对你有收获,请帮顶。

另外,我本人开通了微信公众号--分享技术之美,我会不定期的分享一些我学习的东西.
你能够搜索公众号:swalge 或者扫描下方二维码关注我

(转载文章请注明出处: http://blog.csdn.net/swagle/article/details/24112823
)

字符串匹配之KMP算法(续)---还原next数组的更多相关文章

  1. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  2. 字符串匹配的 KMP算法

    一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...

  3. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  4. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  5. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  6. 实现字符串匹配的KMP算法

    KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...

  7. 字符串匹配的KMP算法

    ~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...

  8. 字符串匹配的KMP算法详解及C#实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  9. 字符串匹配与KMP算法实现

    >>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个 ...

  10. 字符串匹配的KMP算法(转)

    转载:http://kb.cnblogs.com/page/176818/ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE&quo ...

随机推荐

  1. 【原】jq简易教程

    https://www.jianshu.com/p/3522fe70de19 https://www.jianshu.com/p/6de3cfdbdb0e 1. jq简介 jq可以对json数据进行分 ...

  2. B3. Cocurrent 线程的状态

    [概述] 1). java.lang.Thread 类中定义了一个枚举 State, 定义了线程的六种状态:NEW.RUNNABLE.BLOCKED.WAITING.TIMED_WAITING.TER ...

  3. rem怎么算

    * rem : html根标签的 font-size决定* em 相对于父标签的font-size 决定的* 设计稿的宽一般都是 750px ---> 20px* 750px 1rem = 10 ...

  4. Python 软件开发目录规范

    目录规范: ATM  #工程文件夹 ------| bin  #用来存放可执行文件的 |----  start.py conf  #用来存放配置信息的 |----  settings.py lib  ...

  5. python_流程控制

    1.if...else 语句 单分支 if 条件:    满足条件后要执行的代码 双分支: """ if 条件: 满足条件执行代码 else: if条件不满足就走这段 & ...

  6. C语言学习2

    C语言能够进行嵌套备注的方法: #if(0) do { scanf("%d", &n); getchar(); }]||n>a[M-]); #endif

  7. 数据导出Excel,动态列

    今天碰到一个需求,要求将用户回答的问卷及问题导出Excel表格,问卷对应的问题数量不一致,需要动态添加列表头,简单记录. 要导出Excel需要添加poi.jar包 用户-问卷实体(固定列): pack ...

  8. 【03】AJAX 向服务器发送请求

    AJAX 向服务器发送请求   创建 XMLHttpRequest 对象后,就可以向服务器发送请求了. XMLHttpRequest 对象的 open() 方法和 send() 方法用来向服务器发送请 ...

  9. VS2015 scanf用不了

    #define _CRT_SECURE_NO_DEPRECATE

  10. 【转】 Java中的IO整理

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...