kmp算法笔记(简单易懂)
一般字符串比较长串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算法笔记(简单易懂)的更多相关文章
- kmp算法笔记
https://blog.csdn.net/v_july_v/article/details/7041827#comments 链接讲得很详细,画几个重点方便以后忘了捡 next[]数组从第i位递推算 ...
- KMP算法笔记(云笔记图片版)
- 简单kmp算法(poj3461)
题目简述: 给你两个字符串p和s,求出p在s中出现的次数. 思路简述: 在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了.此题 ...
- 【算法•日更•第三十一期】KMP算法
▎前言 这次要讲的HMP算法KMP算法很简单,是用于处理字符串的,之前一直以为很难,其实也不过如此(说白了就是优化一下暴力). ▎处理的问题 通常处理的问题是这样的:给定两个字符串s1和s2,其中s1 ...
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
随机推荐
- 使用Vuejs 开发chrome 插件的注意事项
chrome 插件的开发其实并不难,web开发者可以使用 html, css, javascript 轻松的开发实用的 chrome 插件. 一个好的 chrome 插件可以提高我们的开发效率,甚至方 ...
- opencv Mat基础
Mat Mat由两部分构成 matrix header pointer to the matrix containing the pixel values Mat is basically a cla ...
- C# get files and write the files full name in txt
static void GetAllFiles() { string path = "filepath"; var allFiles = Directory.GetFiles(pa ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...
- LinkedHashMap,源码解读就是这么简单
概述 LinkedHashMap是HashMap的子类,它的大部分实现与HashMap相同,两者最大的区别在于,HashMap的对哈希表进行迭代时是无序的,而LinkedHashMap对哈希表迭代是有 ...
- 自学_CSS<二>
CSS CSS(层叠样式表)是用来美化页面用的,可以对页面元素进行更精细的设置,样式主要描述元素的字体颜色.背景颜色.边框等. CSS主要有元素内联.页面嵌入和外部引用三种使用方式.CSS是描述元素的 ...
- Flask(Jinja2) 服务端模板注入漏洞(SSTI)
flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...
- python从入门到放弃之协程
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- 【洛谷P3329】 [ZJOI2011]最小割(最小割树)
洛谷 题意: 给出一个无向图,之后有\(q,q\leq 30\)组询问,每组询问有一个\(x\),回答有多少点对\((a,b)\)其\(a-b\)最小割不超过\(x\). 思路: 这个题做法要最小割树 ...
- 初学JavaScript正则表达式(五)
范围类 [ ] 例: 'a1b1c1s1v1d1f1'.replace(/[a-z]/g,'q') //q1q1q1q1q1q1q1 将a-z范围内的字符替换为q 'a1b1c1s1v1d1f1AKS ...