笔记-算法-KMP算法】的更多相关文章

笔记-算法-KMP算法 1.      KMP算法 KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). 1.1.    基本思想 设主串(m)为:BBC ABCDAB ABCDABCDABDE 模式串(p)为:ABCDABD 1.首先,p首位与m第1位匹配,结果为否,搜索后移1位: 2.至P首位与m第4位匹配,后续5位也…
本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串的匹配问题.即给定两个字符串text与pattern,需要判断pattern是否是text的子串.假设text的长度为n,pattern的长度为m,那么用暴力搜索的算法解决该问题需要的时间复杂度为O(m*n).这种算法在m,n大于105级别是无法被接受.而KMP算法需要的时间复杂度仅为O(m+n).Knuth…
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发现了该算法效率并不高.当失配位置之前已经有若干字符匹配时,暴力法很多步骤是多余的.举个KMP算法的例子,看图1 可以看到子串p和主串t在红框处失配了,失配之前的字符串ABC已经匹配.ABA第一个字符A和后面的字符都不同,所以可以放心地直接将子串p的p[0]对齐失配处i,让p[0]和t[i]接着比较.…
内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 str 的子串, 请返回其在 str 第一次出现时的首字母下标,若 match 不是 str 的子串则返回 -1 注:子序列和子串的区别:子序列可以不连续,子串必须连续 2.暴力求解方法 暴力求解方法:将 str 从头开始遍历并与 match 逐次比较,若碰到了不匹配字母则终止此次遍历转而从 str 的…
KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : "adesceqwdasdfagf"; s : "sce"; return : 3; 常规解法 : /** * 常规算法 * 将以i为头的text子串与s串比对 * 如若比对失败则i++;继续比对i子串与s. * @param text * @param s * @retu…
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"***"就可以了.对于子串的查找,就KMP算法就可以了.但是敏感词这么多,总不能一个一个地遍历看看里面有没有相应的词吧! 于是我想到了前几天写的字典树.如果把它改造一下,并KMP算法结合,似乎可以节约不少时间. 首先说明一下思路: 对于KMP算法,这里不过多阐述.对于敏感词库,如果把它存进字典树,并在…
KMP串匹配算法是一个经典的算法. 传统BF算法是传统的字符串匹配算法.很好理解.叶实现.但时间复杂度太高. 本文将从字符串模式字符串被称为.为了匹配字符串被称为主弦. KMP配时能够少移动从串的位置,从而保持主串的索引不移动. 1 原理 如上图所看到的,假设在从串中有A=B,然后在匹配的时候,发现B后面的字符与X后面的字符不匹配,又因为B=X,因此,就有X=A,那么.在下次比較的时候就不用回溯了,直接比較X后面的字符与A后面的字符. 这样就行使遍历主串的索引不移动,仅仅移动从串的索引.因此.时…
KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEABCDABABCDABCDABDE”字符串中,匹配字符串"ABCDABD". 算法思路: KMP算法的思路在于,根据已经匹配的部分字符的信息,不把搜索位置移回已经比较过的位置,这样就提高了效率,是不是还是有点不清楚?没关系,让我们来根据一个例子来切实体会一下KMP算法是如何实现的. 图解:…
kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDABCED BF算法: 第一步: B A B C D A B A B C D A B C E D A                               从主串的第一个字符位置开始与从串第一个字符位置进行匹配,匹配失败 第二步: B A B C D A B A B C D A B C E D  …
准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结构是一组地址连续的存储单元来存储字符串中的字符序列:按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义.——空间分配不灵活,但是字符串一般都是连在一起表述的,”断章取义“的情况并不多,所以习惯上我们还是会直接定义一个足够长度的存储区来存储. 链式存储结构 BF算法…