首页 > 电力

笔记:KMP的复习

来源:博客园 时间:2023-08-01 22:53:18

Record

一个重要的字符串算法,这是第三次复习。

通过总结我认为之所以某个算法总是忘记,是因为大脑始终没有认可这种算法的逻辑(也就是脑回路)。


(资料图)

本篇主要讲解从KMP的应用场景,再到算法知识,以及例题。

Main

现有两个字符串 \(A, B\),求出 \(A\) 在 \(B\) 中出现的次数。范围:字符串长度均 \(\leq 1e6 + 10\)。

其实简单来说,KMP就是优化了双重循环,解决字符串的匹配问题。

所以个人总结一下,遇到字符串的题目,如果dp用不了就考虑哈希和KMP

数学上从特殊到一般,那么这里我们从暴力到优化。

以 \(A = abab , B = abababaaabb\) 为例,一般做法是双重循环,时间复杂度 \(O(n ^ 2)\)。

我们来看这个具体是怎么实现的。

每次枚举一个初始点,然后一位一位的判断是否相同。如果相同,就继续判断直到;如果不同,就退出并且选择下一个点作为初始点。

首先,如果说判断到第 \(k\) 位发现不对,不是彻底无法挽救的。如果说这个子串从 \(1 .. k - 1\) 的前缀和后缀都没有相同的,比如说这种 \(abcfd\),那么判断过的位也不用再判断了,因为往后移一位就都错开了,所以就一直往后推,判断起点是否相同,相同就开始一位一位继续判断。如果说是这种 \(abcabc\) 那就好办了,因为我们可以进行如下的操作。

abcabcbddeabcabcd

这个时候再第七位发现有问题了,是不是全部跳过呢?当然不是。

abc|abcbdde   |abcabcd

再从相同的前缀开始就可以了。只不过显然这个情况下还是匹配不了。

for(int i = 1, j = 0; i <= m; i ++ )    {        while(j && b[i] != a[j + 1]) j = ne[j];        if(b[i] == a[j + 1]) j ++ ;        if(j == n)        {            cout << i - n << " ";            j = ne[j];        }    }

通过这样的思路,只需要每次遍历一遍母串,时间复杂度 \(O(n)\)。

在匹配之前,得要算一下子串中每一位对应的最长的前缀和后缀,记录下前缀的最后一位。

for(int i = 2, j = 0; i <= n; i ++ )    {        while(j && a[i] != a[j + 1]) j = ne[j];        if(a[i] == a[j + 1]) j ++ ;        ne[i] = j;    }
例题

周期

利用ne数组的性质,马上就可以得到一个字符串最长的相同前缀和后缀。观察发现,存在循环节的字符串观察可知:

当第 \(i\) 位存在 \(i \mod{(i - ne_i)} = 0\),那么他的循环节一定是 \(i - ne_i + 1 ... i\),个数是 \(i / (i - ne_i)\)。

这个自己打打草稿就出来了,不多说了。

代码

相关稿件

笔记:KMP的复习

广东放弃马尚,他加盟弱队,朱芳雨的决定引发争议

有人群里加我好友,让我去秦皇岛扶贫办领救济款,还把他的身份证

驰援K1178!救援列车难以抵近,突击队员徒步搬运食品

雅化集团:与特斯拉续签氢氧化锂供货协议

齐齐哈尔市梅里斯街道开展隔代教育能力提升小组活动

福建省华安县发布暴雨黄色预警

8月券商金股出炉,宁波银行最受追捧!政策面迎重磅利好,机构看好本月行情

三峡旅游已累计回购1.47%股份 耗资约5700.18万元

环县800多名大学生在家门口实现“数字就业”

8月1日大连热电涨停分析:电力体制改革,PET复合铜箔,可降解塑料概念热股

北运河左堤这一路段封控!北辰最新通知!

8月1日上海瑞洵天然橡胶主流报价平稳

黔哨│“来贵州,我‘氧’你”,喊出这句话需要多少实力?

EDTMPA 乙二胺四甲叉膦酸商品报价动态(2023-08-01)

上半年我国交通运输经济整体好转

北京全市平均降水超260毫米,南来的台风为何引发北方暴雨?

突然砸盘!“旗手”跑偏 所为何因?这个9万亿市场遭遇致命一击 发生了什么?

扩散!今晚开始,暴雨再次强势来袭!这份暴雨防灾避险指南请收藏~

重温鼓岭故事,延续中外情缘:北京大学国际新闻传播研究生调研团队参访鼓岭

【两公布一提示 | 恶劣天气提示】雨天开车请注意!

雅化集团:与特斯拉续签氢氧化锂供货协议

公司在万华化学的15万吨CCUS项目进展到哪一步了?冰轮环境:开始试生产了

蔚来站起来了!7月交付20462辆创史上新高 同比暴涨超100%

网传蔚来ES8撞上路柱起火,网友:明显有问题

打造工业互联网云平台 江津制造加速转向“江津智造”

国家发改委:支持长三角、粤港澳大湾区、京津冀等加大营商环境改革力度

翡翠墨玉和墨翠

碧墨玉原石什么样

衣瑛杰离任中邮创业旗下3只基金