什么是KMP算法?
一、KMP算法
KMP 是一个解决模式串在文本串是否出现过,如果出现过,较早出现的位置的经典算法。
Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。
KMP 方法算法就利用之前判断过的信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间。
KMP算法可以在时间复杂度为O(m+n)的时间数量级上完成模式匹配操作。
其不同点在于,在匹配失败之后,不需要回溯i指针,而是利用已经“部分匹配”的结果,将模式串T向右滑动尽可能远的距离。KMP 算法用了一种聪明的办法,当发现字符串不匹配的时候,并不会从头开始比较,因为之前已经匹配成功的字符可以给我们提供一些有用的信息,利用这个信息我们可以将子串移动到某个位置,并从这个位置直接开始比较,它的时间复杂度降到2个字符串的长度之和。
延伸阅读:
二、字符串的前缀和后缀
首先我们需要知道字符串的前缀和后缀:
对于字符串 ababc 来说,它的前缀有 [a,ab,aba,abab],也就是以字符串名列前茅个字符作为开头,同时不包括最后一个字符的所有子串,同理它的后缀有 [c,bc,abc,babc],也就是以字符串最后一个字符作为结尾,同时不包括名列前茅个字符的所有字串。
了解了这个,我们再来说什么是字符串的最长公共前后缀,说白了,也就是前缀和后缀这 2 个集合中的相同部分,同时取最长的那个,就是这个字符串的最长公共前后缀。显然,在这个例子中,ababc 是没有公共前后缀的。但是对于 abab,它的前缀和后缀分别是 [a,ab,aba] 和 [b,ab,bab],那么它的最长公共前后缀就是 ab。

猜你喜欢LIKE
相关推荐HOT
更多>>
call和apply区别?
一、call和apply区别apply:非常多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,...详情>>
2023-10-20 21:29:16
OC中协议和多态有什么区别?
一、OC中协议和多态的区别在Objective-C中,协议(Protocol)和多态(Polymorphism)是两个不同的概念,它们的区别如下:协议(Protocol):协...详情>>
2023-10-20 20:24:31
Android开发中为什么很少使用JSON存储数据?
一、Android开发中为什么很少使用JSON存储数据因为数据库我可以对它进行设计,按照我要的格式来搭建,我可以随时新增一条数据,查询一条数据,...详情>>
2023-10-20 19:17:07
为什么Java后端开发没有大规模采用 Kotlin?
一、为什么Java后端开发没有大规模采用 Kotlin以下是我和我的同事们看到的一些原因。“我们没有时间学习一门新语言”这也就是我们在软件开发项...详情>>
2023-10-20 14:03:28热门推荐
公共数据和政务数据有什么区别?
沸流式计算和实时计算有什么区别?
热managed runtime与非managed runtime有什么区别?
热css和html的区别?
新call和apply区别?
顺序表和数组有什么区别?
OC中协议和多态有什么区别?
git的fetch和pull区别?
Android开发中为什么很少使用JSON存储数据?
goal, mission, vision, objective, result和aim之间有什么区别?
什么是php扩展?
为什么插件化对Android开发人员如此重要?
PHP从入门到高级需要掌握什么?
什么是算法?