一般字符串比较长串m短串为n,那么用暴力方法复杂度为O(m*n)

但是kmp却可以达到O(m+n)!!!!!!

对于这个神奇的算法,我也是似懂非懂,

下面介绍一个简单的方法求kmp

1、求next数组

  这个数组时kmp的灵魂!next数组时对于短串n求的

  步骤:

    1)next[0]=-1

    2)  next[i]=前面的字符串中最大公共子串长度

    例子:

    设m串为:a b a b c, 串长为5,那么next数组长度为5,下面是对应的next数组

    

      可以看到,b下面有一个1,这个1是怎么得来的呢?》》是根据前面aba这个串得来的,aba串的最大公共子串长度为1

    aba最大公共子串是a,因为从左边数连续的最大子串(小于母串长度)是a,从右边数连续最大子串也是a,所以next【3】=1

                         

    c下面的2是由于前面的串abab的最大公共子串长度为2(公共子串为ab)

                    

    再比如aaaa最大公共子串长度为3(从左边连续最大子串=从右边连续最大子串=aaa)

                    

2、使用next数组,和长串n短串m进行匹配

  1、首先前三个都匹配上了,但是到箭头处不匹配了,下面进行m串移动

  

  2、移动后如下图

  

    怎么移动的呢?

     由于a和b不匹配所以m串右移,看next数组对应的b下面的值为1,那么是把m串的下标为1的位置和箭头对齐。

    现在继续从箭头处向后比较,发现不匹配,再移动》》看到对应b下的值为0,那么把m串下标为0的位置和箭头对其

    

    依旧不匹配,再移动,此时a对应下标为-1,但是数组没有-1的位置,其实这里-1的位置与箭头对其就等价于m串右移一维,注意这里要多做一个操作,就是比较的位置向后移动一位,如果此时n串下标在箭头处为j,那么执行j++,相对的m串执行i++,如下图

    

  继续比较

    

  可以看到,箭头走到了m串的末尾,匹配到了!!

  3、可以看到匹配到了,如果后面还有子串m那么将继续寻找,移动m串使得下标为2的位置对其箭头,不匹配查询结束。

  

这里仅仅介绍原理和方法,代码网上有很多就不展示了,下面是哔哩哔哩上的视频教程,如果没有明白可以看看视频连接附上(https://www.bilibili.com/video/av52365939/?spm_id_from=trigger_reload

kmp算法笔记(简单易懂)的更多相关文章

  1. kmp算法笔记

    https://blog.csdn.net/v_july_v/article/details/7041827#comments 链接讲得很详细,画几个重点方便以后忘了捡 next[]数组从第i位递推算 ...

  2. KMP算法笔记(云笔记图片版)

  3. 简单kmp算法(poj3461)

    题目简述: 给你两个字符串p和s,求出p在s中出现的次数. 思路简述: 在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了.此题 ...

  4. 【算法•日更•第三十一期】KMP算法

    ▎前言 这次要讲的HMP算法KMP算法很简单,是用于处理字符串的,之前一直以为很难,其实也不过如此(说白了就是优化一下暴力). ▎处理的问题 通常处理的问题是这样的:给定两个字符串s1和s2,其中s1 ...

  5. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  6. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  7. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  8. 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...

  9. [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...

随机推荐

  1. H5混合应用之X5内核

    一.X5内核介绍 X5内核是腾讯公司基于优秀开源 webkit 深度优化的浏览器渲染引擎,并且在2014年正式宣布开放给app开发者,所以现在可以在很多app上看到都是使用的X5内核实现Hybrid混 ...

  2. 转载:ubuntu下编译安装nginx及注册服务

    原文地址:https://www.cnblogs.com/EasonJim/p/7806879.html 安装gcc g++的依赖库 sudo apt-get install build-essent ...

  3. MYSQL 高级语法

    1.高级建表和插入 使用creat 和select 进行建表操作,中间采用AS 标识符: CREATE TABLE new_table AS SELECT * FROM exist_table LIM ...

  4. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  5. ls用法

    常用 ll -h  大小直接显示K,M,G 语 法:ls [-1aAbBcCdDfFgGhHiklLmnNopqQrRsStuUvxX][-I <范本样式>][-T <跳格字数> ...

  6. Apache2 在Linux环境下的安装

    安装Apache2: apt-get install apache2 启动Apache2服务: service apache2 start 在终端运行启动后,打开浏览器URL访问 http://loc ...

  7. postgres 导出单个表的语句

    -U表示用户 -h表示主机 -p表示端口号 -t表示表名 -f表示备份后的sql文件的名字 -d表示要恢复数据库名称 1.备份单表操作 ?pg_dump -U postgres -h localhos ...

  8. UITableView总结

    .协议介绍 UITableViewDataSource() UITableViewDelegate(常用) .刷新 下拉刷新: 上拉刷新 .搜索 .重用 自定义cell 不使用重用方法 注册Cell ...

  9. 关于ML.NET v1.0 的发布说明

    今天,我们很高兴宣布发布 ML.NET 1.0.ML.NET 是一个免费的.跨平台的开源机器学习框架,旨在将机器学习(ML)的强大功能引入.NET 应用程序. ML.NET GitHub:https: ...

  10. idea插件(mybatis框架下mapper接口快速跳转对应xml文件)亲测好用!

    我相信目前在绝大部分公司里,主要使用的框架是S(spring)S(spring MVC)M(mybatis),其中mybatis总体架构是编写mapper接口,框架扫描其对应的mapper.xml文件 ...