今儿套KMP模板做了个题,敏敏找我讲next[]数组的时候把我问懵了。具体原理都记不清了光靠模板凑得了一时凑不了一世啊,所以再捋一捋顺一顺,这次印象要深刻一点了;

KMP与暴力匹配的优化区别就不再提了,O(m+n)的复杂度已经完胜了,直接进入正题...

以下言论均是总结自该同学的,是不是原创我不清楚,链接反正是给你们吧...

匹配串S,模式串T;

首先是KMP的精华所在,next[]数组

next[i]=k的意思为:T[i]前面有k个字符和字符串T的前k个字符相同,且T[i]不等于开始的k个字符之后的第k+1个字符,  1<=k<j;

所以从另一种解题层面上讲,next[len]的值表示字符串str[0...len-1]的后缀等于str[0...len-1]前缀的最长长度,例题运用:hdu 4763;

举个例子:

0 1 2 3 4 5 6 7 8

S: a b c  a b c a b d

T: a b  c a b d a b a

1<=k<j, 因为T[0...1] = T[3...4],且T[2] != T[5],则next[5] = k = 2;

若T[2] == T[5]时,next[5] = 0; --> 为什么呢?

理解这个首先要明白利用next[i]我们可以做什么
根据next[5] = 2,有T[3] == T[0],T[4] == T[1],又因为S[4] == T[4],S[3] == T[3],所以S[3] == T[0],S[4] == T[1](两对相当于间接比较过了)。
接下来比较S[5]和T[2]是否相等,如果按问题的假设,T[2] == T[5],那么必然对于模式串T匹配到S[5]的位置仍是不匹配的;故此时的next[5]=0,模式串从T[0]与S[5]开始匹配;

有一个问题来了:S[3]和T[0],S[4]和T[1]是根据next[5]=2间接比较相等,那S[1]和T[0],S[2]和T[0]之间又是怎么跳过比较的呢?
我们一步步来,S[0]=T[0],S[1]=T[1],S[2]=T[2],

      而T[0] != T[1], T[1] != T[2](这里只是针对具体例子,但只要next[i] = k,那么S[1]、S[2]和T[0]间总会间接比较的)

    ==> S[0] != S[1], S[1] != S[2],所以S[1] != T[0],S[2] != T[0]. 还是从理论上间接比较了。

下面重点来了,next[]怎样取值以及进行字符串匹配时next值又有什么存在意义呢?

next[]函数定义如下:
(1)next[0] = -1 意义:任何串的第一个字符的模式值规定为-1。
(2)next[j]  = -1 意义:情况①->模式串T中下标为j的字符与首字符相同,且j的前面的1~k个字符与开头的1~k个字符不相等(1≤k<j).

                情况②->下标为j的字符前面的1~k个字符与开头的1~k个字符相等T[k]==T[j],(1≤k<j)。 如:T="abCabCad",T[0...2] == T[3...5]但T[3]=T[6],则next[6]=-1;
(3)next[j]  = k  意义:模式串T中下标为j的字符,如果j前面的k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。即T[0...k-1] == T[j-k ... j-1] 且T[j] != T[k];
(4)next[j]  = 0  意义:除(1)(2)(3)的其他情况。

对于不理解的可以看一下我给的链接里文章的例子,我就不再粘过来了。

那么在进行字符串匹配时next值又该怎么使用呢?
1. next[i]= -1 表示S[cur]和T[0]间接比较过了,不相等,下一次比较 S[cur+1] 和T[0]
2. next[i]=0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。
3. next[i]= k > 0 但k < n, 表示,S[cur]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[cur]和T[k]相等;
4. 其他值,不可能。

基本KMP的知识就是这样了,今天先暂时到这里,日后会继续补充;

【KMP原理】【整理回顾】的更多相关文章

  1. 字符串系列——KMP模板整理

    KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...

  2. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  3. KMP原理、分析及C语言实现

    (是在matrix67博客基础上整理而来,整理着:华科小涛@http://www.cnblogs.com/hust-ghtao/) 有些算法可以让人发疯,KMP算法就是一个.在网上找了很多资料讲的都让 ...

  4. [区块链|非对称加密] 对数字证书(CA认证)原理的回顾

    摘要:文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的 ...

  5. 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单

    结构思考力 名义上全书是讲结构化思考,实际内容是用结构化思考的方法来整理PPT的思路,让PPT的逻辑更清晰.少部分提到如何修改标题更吸引人,如何做图表设计. 书中结构化思考的基本思路,重要的有两个:1 ...

  6. dynamic-load-apk插件原理整理

    因为当前项目功能越来越多,编译速度越来越慢(公司电脑配置也挺差的...),并且方法数已超出65535的限制了,虽然通过multidex暂时解决了,但是这并不是一个好的解决方式.所以通过插件来加快编译速 ...

  7. KMP算法简单回顾

    前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...

  8. Java的HashMap实现原理整理总结

    通过Debug 探寻Java-HashMap 实现原理: 一个简单的例子,代码如下, 测试方法 main: public static void main(String[] args) { KeyOb ...

  9. HDOJ4763(KMP原理理解)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

  2. rsync 无密码传输文件

    最近机器迁移,需要备份文件,但各个机器间不能穿梭,即无法通过scp来传输文件, 在运维的建议下,选用了rsync作为传输的工具. 默认情况Ubuntu安装了rsync服务,但在/etc下没有配置文件, ...

  3. hdu 1151 Air Raid(二分图最小路径覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 Air Raid Time Limit: 1000MS   Memory Limit: 10000K To ...

  4. UVaLive 6627 First Date (转换时间)

    题意:给定两个日期,两种不同算闰年的方法,导致日期不同,给定那个慢的,求你求了那个快的. 析:因为算闰年的方法不同,所以我们就要先从1582算到当前时间,算出差了多少天,再加上就好.注意跨月,跨年的情 ...

  5. ssh使用ajax异步通讯. json与对象转换的几个小问题

    首先是hibernate,用ssh做项目的时候,使用hibernate,这个hibernate博大精深,至今只懂皮毛.建对象时候使用它的一对多,多对多联系,. 这样子,对象转json的时候会产生循环依 ...

  6. [1.1]Environment preset on a Windows server

    1. Python 3.5.1 (also on your personal computer) 2. Django 1.10.1 (also on your personal computer) 3 ...

  7. JavaEE通过response实现请求重定向

    请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.302状态码和location头即可实现重定向. 请求重定向最常见的应用场景就是用户登录. 下面 ...

  8. C语言高效编程的几招(绝对实用,绝对经典)

    编写高效简洁的C语言代码,是许多软件工程师追求的目标.废话不说,走起! 第一招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题 eg.字符串的 ...

  9. linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)

    程序猿都非常懒,你懂的! 近期在开发中,须要用到server的ip和mac信息.可是server是架设在linux系统上的,对于多网口,在获取ip时就产生了非常大的问题.以下是在windows系统上, ...

  10. Python 类型的分类

    1.存储模型,对象可以保存多少个值.如果只能保存一个值,是原子类型.如果可以保存多个值,是容器类型.数值是原子类型,元组,列表,字典是容器类型.考虑字符串,按道理,字符串应该是容器类型,因为它包含多个 ...