标签:子串 主串 匹配 Next 多图 详解 arr2 KMP
目录
前言
KMP算法作为程序员的必修课之一,其抽象的过程让初学者叫苦不迭,但是当你完全理解过后会发现其中蕴含着创造者的无穷智慧。本篇文章我将以大量的例子与图片,为你讲解这个奇妙的算法。
1.KMP算法是什么?
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) [1]
。(来自百度百科)
简而言之就是:减少在主串找子串的过程中回退的次数。(先有个概念就行,后面会仔细讲解)
2.为什么需要KMP算法?
在回答这个问题前我们需要知道先知道两个问题。
什么叫主串找子串?
不用kmp算法,直接暴力求解是怎样的?
2.1主串找字串
现在我们有主串:arr1[] = "abababc",子串:arr2[] = “abc”。那么我们在arr1中找到arr2在其中位置的过程就叫做主串找子串。
2.2暴力求解
在暴力求解中,我们是将子串和主串逐一匹配,如果第一个字符相等就继续匹配第二个字符,直到子串与主串全都匹配成功,就返回子串的位置,一旦其中某两个字符匹配不成功,主串就回到开始匹配字符的下一字符,而子串回到第一字符。
上面的话可能有一点绕,那么看了下面的图片你就会明白暴力求解的思路。
还是这俩字符串,主串:arr1[] = "abababc",子串:arr2[] = “abc”。
绿色是回溯的位置,红色是匹配结束的位置。
(1) 第一次匹配成功,第二次匹配成功,第三次匹配不成功。
(2) 前面匹配失败,第一个字符串回到第二个字符'b',第二个字符串回到第一个字符'a'处。
第一次匹配失败。
(3) 前面匹配失败,第一个字符串回到第三个字符'a',第二个字符串回到第一个字符'a'处。
第一次匹配成功,第二次匹配成功,第三次匹配不成功。
(4) 前面匹配失败,第一个字符串回到第四个字符'b',第二个字符串回到第一个字符'a'处。
第一次匹配失败。
(5) 前面匹配失败,第一个字符串回到第五个字符'a',第二个字符串回到第一个字符'a'处。
第一次匹配成功,第二次匹配成功,第三次匹配成功,子串走到尽头,成功找到在第一字符 串找到第二字符串。
通过以上举例可以看出,传统的暴力求解,需要多次回溯,且第一个字符串和第二个字符串都需要回溯,而且例如(2)(4)步,明显回溯过去也一定是错的,那有没有什么办法让他回溯到特定的位置,不至于像暴力求解一样,产生许多不必要的步骤,于是就有了本篇的重点:
KMP算法!!!
3.KMP准备工作
在学习KMP算法之前我们还需要进行一些小小的的准备。这对你掌握KMP算法是非常必要的。
3.1字符串的前后子串
先抛开找字符串的问题,抛开什么KMP算法,我们来了解一下什么叫一个字符串的前后相等子串。
--假设有这样一个字符串:a[] = "abcabcabc";
那么他的前子串的集合为:{"a","ab","abc","abca","abcab","abcabc","abcabca","abcabcab"}
看不懂?上图!图片顺序是从左向右哦!(注:作者懒,字符串的\0我没画
标签:子串,主串,匹配,Next,多图,详解,arr2,KMP 来源: https://blog.csdn.net/Zero__two_/article/details/120334582
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。