注:本文字符串下标从 0 开始
略谈 KMP
啥是 KMP?
在计算机科学中,Knuth-Morris-Pratt 字符串查找算法(简称为 KMP 算法)可在一个主文本字符串 S 内查找一个词 W 的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。
简而言之,KMP 用来在一个字符串中查找所有子串的位置
比如,在字符串kmp-is-used-to-ak-ioi
中,子串i
出现了三次:
kmp-s-used-to-ak-o
而子串-i
一共出现了两次:
kmps-used-to-akoi
够简单吧
朴素做法
用两个指针表示“当前正在处理”,那么每次判断是否满足,如果是那么
,处理下一位,否则,,相当于起点后移一位重复上述过程。
这种做法的时间复杂度如何呢?事实上,在随机数据测试时,朴素做法可以达到接近于的复杂度,但如果碰上出题人恶意构造的数据,可能被卡成
优化
考虑当时的情况。此时其实有隐含条件:,在朴素做法中,这些信息完全被浪费了
那么我们该怎么利用这些信息呢?很简单,定义数组(部分讲稿也有叫或者的),表示当(称作“失配”)时,就直接,相当于模式串向右移动
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于