相信通过今天的文章,你会对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. caffe实现自己的层

    http://blog.csdn.net/xizero00/article/details/52529341 将这篇博客所讲进行了实现 1.LayerParameter也在caffe.proto文件中 ...

  2. VC:UI编程

    VC++中给对话框设置背景图片的方法 -----------------------------------------------------方法一(铺满窗口)------------------- ...

  3. sqlserver 创建索引 物化 视图

    索引视图: create view  Test WITH SCHEMABINDING as select Id, Name from [dbo].[InterfaceCallSetting]creat ...

  4. 面试之Redis

    面:缓存中间件--Memcached和Redis的区别是什么? 答:Memcached的优点是简单易用,代码层次类似与Hash.支持简单数据类型,但不支持数据持久化存储,也不支持主从同步,也不支持分片 ...

  5. react之webpack

    1. 下载相关模块包 * 创建package.json ``` npm init ``` * react相关库 package-lock.json ``` npm install react reac ...

  6. 大项目之网上书城(八)——数据库大改&添加图书

    目录 大项目之网上书城(八)--数据库大改&添加图书 主要改动 1.数据库新增表 代码 2.数据库新增触发器 3.其他对BookService和BookDao的修改 代码 4.addBook. ...

  7. 梦回----32位CPU和64位CPU的通用寄存器

    1 32位Intel的CPU通用寄存器 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX):2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP):6个段 ...

  8. js 技巧 (二)

    //最小化,最大化,关闭 <object id=min classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">  & ...

  9. buf.slice()

    buf.slice([start[, end]]) start {Number} 默认:0 end {Number} 默认:buffer.length 返回:{Buffer} 返回一个指向相同原始内存 ...

  10. pyton学习之路

    文件操作 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:   不存在则创建:存在则只追加内容:] "+" ...