全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

什么是KMP算法?

发布时间:2023-10-11 16:45:13
发布人:xqq

一、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。

#it技术干货

相关文章

node.js可以用来做什么?

node.js可以用来做什么?

2023-10-11
大数据平台和云平台的区别?

大数据平台和云平台的区别?

2023-10-11
有什么好的开源自动化测试框架可以推荐?

有什么好的开源自动化测试框架可以推荐?

2023-10-11
网站域名有www没有www区别?

网站域名有www没有www区别?

2023-10-11

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取