数据结构-串-KMP算法详解(Next数组计算)(简单易懂)
文章目录
- KMP介绍
- 一、求Next数组
- 前后缀表
- 求最长公共前后缀
- 最长相等前后缀表转Next数组
- 二、使用Next数组来匹配字符串
- 总结
本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的,暴力匹配算法应该也都了解过了)
为什么网上那么多讲kmp 我还发文章,很多文章我觉得讲的不是太通俗易懂,大多数我看起来都觉得有些懵逼
KMP介绍
提示:以下信息来源百度
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)
上面讲了kmp需要求匹配字符串的next数组来快速匹配,那我们先来讲解一下如何求next数组
一、求Next数组
求Next数组前我们需要了解字符串的前缀表与后缀表
前后缀表
如字符串“ABCD”的前后缀表
了解完字符串前后缀,接下来我们要开始求最长公共前后缀
求最长公共前后缀
我们以“aabaac”为例
字符串中要没有公共的前后缀就为0
从以上方法就能求出字符串“aabaac”的最长公共前后缀数组为
[0,1,0,1,2,0]
最长相等前后缀表转Next数组
当然变成Next数组前还需要进行简单的处理(其实也就把最长公共前后缀数组右移而已)
在最长公共前后缀前面加上 -1 并去掉最后一位就是next数组了
Next数组的第一位永远是-1,第二位永远是0
注意:Next数组有很多种求法,依据匹配字符串的代码来做选择,我选择的方法next数组第一位是-1,还有另一种方法开头是0,但原理都是相同的所以不必纠结
二、使用Next数组来匹配字符串
为了能较好体现kmp算法:
主串:“aaacaacaaad”
模式串:“aaad”
模式串Next数组:[-1,0,1,2]
在主串和匹配串字符相同的情况下,指针 i 和 j 后移
或者遇到主串和匹配串字符不相同时 但next值为-1时指针 i 和 j 后移
步骤一:
1i、1j、2i、2j代表指针位置及步骤,中间字符相等的地方我就不讲了,就主要讲重点的地方
指针4i和4j的字符不相同,不匹配位置的next值为2(蓝色的a),所以需要将匹配串右移到匹配串索引2的位置
步骤二:
匹配串后移后指针i和j的字符依然还是不相同,不匹配位置的next值为1(蓝色的a),所以需要将匹配串右移到匹配串索引1的位置
步骤三:
匹配串后移后指针i和j的字符依然还是不相同,不匹配位置的next值为0(蓝色的a),所以需要将匹配串右移到匹配串索引0的位置
步骤四:
匹配串后移后指针i和j的字符依然还是不相同,但这时next值为-1,这就需要指针i和j向后移
步骤五:
指针i和j后移后,(中间字符相同的地方就不解说了),指针到3i和3j的字符不相同,next值为1,然后就和之前讲的步骤一样,需要将匹配串右移到匹配串索引1的位置
步骤六:
后面的步骤就不再多叙述,自己看图分析
步骤七:
步骤八:
然后这就匹配完成了
总结
代码后续会补充
非常感谢您能看到这,本人第一次写文章,所以我可能讲的不是很好,如有问题望大家能多多提醒,感谢。下次讲sunday算法
注:如看不懂,可以的话,麻烦您在评论区中发句看不懂,好让我知道我写的烂不烂
数据结构-串-KMP算法详解(Next数组计算)(简单易懂)相关推荐
- 数据结构 串 KMP 模式匹配详解 通俗易懂
KMP 模式匹配详解通俗易懂 KMP 模式匹配是解决字符串匹配的问题 一.原始的字符串暴力匹配 要点:子串的第一个字符匹配成功主串的字符后就依次匹配子串后面的字符,直到子串匹配结束 代码: publi ...
- KMP算法详解及各种应用
KMP算法详解: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题 ...
- KMP算法详解及代码
KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...
- 字符串匹配之KMP算法详解
kmp算法又称"看毛片"算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚. ...
- KMP算法详解P3375 【模板】KMP字符串匹配题解
KMP算法详解: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt(雾)提出的. 对于字符串匹配问题(such as 问你在abababb中有多少个 ...
- 奇淫巧技的KMP算法--详解
奇淫巧技的KMP算法–详解 花了一下午时间,看了十几个博客,终于拿下了KMP高地,现在总结下下自己对KMP的理解和实现. 情景1 假如你是一名生物学家,现在,你的面前有两段 DNA 序列 S 和 T, ...
- 【数据结构Note4】-串、数组和广义表(kmp算法详解)
文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...
- 【原创】KMP算法详解
前言 KMP算法是学习数据结构 中的一大难点,不是说它有多难,而是它这个东西真的很难理解(反正我是这么感觉的,这两天我一直在研究KMP算法,总算感觉比较理解了这套算法, 在这里我将自己的思路分享给大家 ...
- BF与KMP算法详解
日升时奋斗,日落时自省 目录 一.BF暴力算法 二.KMP算法 1.next数组 2.next数组优化(nextval) 一.BF暴力算法 暴力算法是普通的模式匹配算法 针对一个主串和一个子串,子串是 ...
最新文章
- 运维笔记--postgresql占用CPU问题定位
- python001 一,Python 入门技巧、Python概述及环境准备
- mysql引擎测试_MySQL MyISAM引擎和InnoDB引擎的性能测试
- java验证身份证号码是否有效源代码
- 想不想在手机上敲 Python 代码?!这里有一款推荐方案
- Android Palette颜色提取
- hdu 2594(kmp)
- redis命令参考string---MSETNX
- 网络工程师专用linux,软考网络工程师考点精讲之Linux系统
- 雷云云服务器文件夹,配置文件云存储 雷蛇Synapse2.0_雷蛇鼠标_键鼠评测-中关村在线...
- Android AndroidManifest.xml文件权限出现“Permission is only granted to system apps”的解决办法
- 开源的Jshop微信小程序商城源码
- 本地文件共享到云服务器,本地和云服务器文件共享
- java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...
- 中文语音评测之thchs30+gop_speechocean762实现
- 在线24点计算器工具
- APP运营推广那点事
- smart-link/monitor-link
- PCI Express解析——系列文章【2】:PCIe原理分析之——PCI Express线路基础
- 路桥凝冰在线监测系统装置