上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ。

附上链接http://www.cnblogs.com/yjiyjige/p/3263858.html

对于整个KMP算法,最精髓的部分便是关于next数组的生成。一开始ruijia liu的书上贴上的代码感觉完全不能理解,但是看神犇的分析觉得似乎明白了什么故写下此文来理理思路。

在整理思路之前首先记住一句话:next[j]表示的是当在str2[j]!=str1[i]时,j指针应该移向的位置。

对于next[j]的还有一种理解:对于0到当前j这样一段字符串,是前缀与后缀相同长度的最大值

如对于abcab,next[5]=2,则表示当str2[5]!=str1[i]时(虽然这样的情况不可能存在,因为此时已经发现最大长度),应该直接从str[2]开始比较,因为对于当前子字符串,前缀"ab"等于后缀"ab",因此直接从j=2开始比较即可。(这种貌似要形象一点,注意是“当前字符串”)。

然后怒贴代码逐句分析(不能理解处点入链接)

void getnext()
{
    next[0]=next[1]=0;// 当j=0时匹配即不成功的话自然还是应当从0开始匹配

//而1是自然应该从0开始比较无疑
    for(int i=1;i<len2;i++)//牢记目标,是为了求出当i+1不能匹配时j指针应该回到的位置
    {
        int j=next[i];//j是临时的一个变量,暂时存放之前得到的比较结果,减少比较量
        while(j&&str2[j]!=str2[i]) j=next[j];//这里便是分歧之一:当j=0时自然不用说,当j不等于零时,便更深一步与靠前的前缀进行比较,这样一是可以节省运算量,

//二是可以确定所得的next[j]是最大的,若不是最大的必然会在比较中漏比较
        next[i+1]=str2[j]==str2[i]?j+1:0;//当前str[j]==str[i]的话就是当前next[j]+1;如果不想等就是0,即前缀后缀无相等的部分
    }
}

在有两道题HDOJ 1711 HDOJ 1358都是基本应用,AC吧!

关于KMP算法的理解的更多相关文章

  1. 自己对kmp算法的理解,借由 28. 实现 strStr() 为例

    做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...

  2. KMP算法 --- 深入理解next数组

    在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...

  3. KMP算法的理解

    ---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法 ...

  4. 关于《数据结构》课本KMP算法的理解

    数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...

  5. 我对KMP算法的理解

    KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...

  6. KMP算法自我理解 和 模板

    字符串   abcd abc abcd abc 匹配串   cdabcd 匹配串的 next  0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...

  7. 第十一章 串 (c3)KMP算法:理解next[]表

  8. kmp算法初步理解

    123456789 abbdaxnds Next   01212 第三位看第二位b,第二位和第三位相同,都是b,所以第三位的next是第二位的next加1,即1+1=2 第四位看第三位b,第四位d与第 ...

  9. KMP算法中next函数的理解

    首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...

随机推荐

  1. keycloak集成微信登陆~解决国内微信集成的问题

    之前看了国内写的微信集成keycloak的文章,然后拿来就用了,但我的是jboss部署的keycloak,然后使用他的包之后,会出现类无法找到的问题,之后找了很多资料,多数都是国外的,在今天终于找到了 ...

  2. 解锁Renderbus客户端使用新技巧----快速渲染效果图篇

    度娘说,效果图最基本的要求就是:应该符合事物的本身尺寸,不能为了美观而使用效果把相关模型的尺寸变动,那样的效果图不但不能起到表现设计的作用,反而成为影响设计的一个因素.可见高效渲染效果图是都是当下我们 ...

  3. 【剑指Offer】链表的基本操作之创建、插入、删除

    // C++ #include<iostream> using namespace std; //链表的定义 struct ListNode { int val; ListNode* ne ...

  4. DTCC 2020 | 阿里云李飞飞:云原生分布式数据库与数据仓库系统点亮数据上云之路

    简介: 数据库将面临怎样的变革?云原生数据库与数据仓库有哪些独特优势?在日前的 DTCC 2020大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部总裁.ACM杰出科学家李飞飞就<云原生分布式数 ...

  5. Azure Terraform(四)状态文件存储

    一,引言 我们都知道在执行部署计划之后,当前目录中就产生了名叫 "" 的 Terraform 的状态文件,该文件中记录了已部署资源的状态.默认情况下,在执行部署计划后,Terraf ...

  6. 腾讯QQ,人人都是高手

    今天,腾讯果然给出了官方回应,具体表述如下: 可能你看不太懂,其实我也看的不太懂,不过这就是公关的能力体现,就像我"人人都是高手"的大连车务组微机室小编一样,把一个降级flash描 ...

  7. three.js cannon.js物理引擎地形生成器和使用指针锁定控件

    今天郭先生说一说使用cannon.js物理引擎绘制地形和使用指针锁定控件.效果如下图.线案例请点击博客原文. 这里面的生成地形的插件和指针锁定控件也是cannon.js的作者schteppe封装的,当 ...

  8. (05)-Python3之--运算符操作

    1.算数运算 num_a = 100 num_b = 5000 # 加法 + print(num_a + num_b) # 减法 - print(num_a - num_b) # 乘法 * print ...

  9. HADOOP 之坑

    hadoop 标签: ubuntu hdfs API 概述 通过API访问hdfs文件系统,出现错误:WARN util.Shell:Did not find winutils.exe:{} HADO ...

  10. (转载)微软数据挖掘算法:Microsoft 决策树分析算法(1)

    微软数据挖掘算法:Microsoft 目录篇 介绍: Microsoft 决策树算法是分类和回归算法,用于对离散和连续属性进行预测性建模. 对于离散属性,该算法根据数据集中输入列之间的关系进行预测. ...