KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词;
暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个;这样算法复杂度最坏就达到了O(m*n),对于大数据肯定不行。
KMP算法的精髓即设法减少不必要的枚举次数,举个例子;比如已经匹配好了单词的前k-1个字母;但第k个字母无法匹配了;那么如果前k-1个字母中存在类似回文的情况(前i个字母组成的子串和后i个字母组成的子串相同),那么指针j就变成i(相当于整体往右移动),这样来达到减少枚举次数的目的;因此 可以预先处理 要找的单词,next【i】=t保存单词的前面i-1个字母中,前t个字母组成的子串和后t个字母组成的子串相同; 并且t尽可能大;
如何来求next【i】呢?初始化next【0】=next【1】=0;从前往后递推;令j=next【i-1】;则表示前i-2个字母中前j个字母和后j个字母相同;那么如果s【j】(第j+1个字母)==s【i-1】(第i个字母),next【i】就等于next【j】+1;如果不相等,那么j变成next【j】;
看了2节晚自习才看明白。。确实不大好理解。。。

下面这题是一个很小的应用:(poj2752,yzoi1780)
题目大意:给定一个长度小于400000的字符串s,要求求出所有i;i满足s的前i个字母组成的子串和后i个字母组成的字串相同;
要求将所有i递增输出;
这题只要求出next数组就好;注意要多求一位(算到next【len】位置);j=len;next【j】=t就是s的前t个字母和后t个字母相同;这样就求出了第二大的i(最大的i就是字符串的长度);然后每次循环j=next【j】;next【j】的值就是一个i的值(注意去掉0);

学习KMP算法的一点小心得的更多相关文章

  1. 学习R语言的一点小心得

    1.目前R 语言处于入门阶段吧,能够执行一些简单的模型了,还是有收获的. 但是在跑模型的时候经常遇到各种各样的错误,最常见的错误就是数据带入模型之后,数据的类型不对,因此模型跑不下去,因此说,利用he ...

  2. BUI Webapp用于项目中的一点小心得

    接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...

  3. ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

    前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...

  4. 学习 KMP 算法

    KMP 算法是用来处理字符串匹配问题的.也就是给你两个字符串,你需要回答:B 串是否是 A 串的子串(或 B 串在 A 串中出现的位置).比如,字符串 A = “ i am student ”, 字符 ...

  5. Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)

    这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...

  6. 用java编网页的学习流程,我的一些小心得(初学java到高深运用)

    (1)java基础:首先得会写int,String,for循环,数组,**等等(熟练各种基础的关键字,各种java自带的排序,随即等等算法)什么是封装,继承,多态,然后private,public,p ...

  7. python+tesseract验证码识别的一点小心得

    由于公司需要,最近开始学习验证码的识别 我选用的是tesseract-ocr进行识别,据说以前是惠普公司开发的排名前三的,现在开源了.到目前为止已经出到3.0.2了 当然了,前期我们还是需要对验证码进 ...

  8. 【2018.07.27】(字符串/找相同)学习KMP算法小记

    虽然说原理很好理解,但是代码理解了花费我一个下午的时间,脑阔痛 该注释的地方都标记了,希望以后看到这些代码我还能好好理解吧 学习的链接地址:https://www.cnblogs.com/teble/ ...

  9. 学习KMP算法

    int kmp(char * t,int lenT,char * pat,int lenPat){ ,posT=; int[] f=partialMatch(pat,lenPat)//获取pat字符串 ...

随机推荐

  1. (一)解决Sublime Text 2中文显示乱码问题

    欲解决问题,关键在于让Sublime Text 2支持GB2312和GBK.步骤如下: 1.安装Sublime Package Control.   在Sublime Text 2上用Ctrl+-打开 ...

  2. Object Pascal 语言基础

    Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...

  3. jquery定位

    1.$("div").offset().left ; div到文档的左距离(offset() 方法返回或设置匹配元素相对于文档的偏移) $("div").off ...

  4. Intellij IDEA-can't use subversion command line client : svn

    http://www.myexception.cn/cvs-svn/1935962.html

  5. tomcat集群配置

    http://www.finereporthelp.com/help/24/1/3/3.html#a:4.1

  6. php 注入

    SELECT * FROM `users` WHERE name = 'a\'b\'d' LIMIT 0 , 30 这个是有结果的,运行正确的,和一般想的不一样,单引号里面可以套单引号,只要里面的单引 ...

  7. MySQL高可用性分析

    版权声明:本文由易固武原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/203 来源:腾云阁 https://www.qclo ...

  8. window2012 64bit 安装sqlserver2012 64bit调用excel的驱动安装

    如果电脑已经安装了32bit的office那么可以使用 管理员权限打开cmd,然会执行以下命令 AccessDatabaseEngine_X64.exe /passive

  9. LR测试https协议设置方法

    测试ssl隧道的设置方法: 前一段时间使用loadrunner测试ssl vpn时,使用ssl隧道一直配置不成功,经过查资料,终于成功,记录一下,方便大家测试.走ssl隧道与普通http,只需多设两个 ...

  10. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...