【模板】KMP

只谈情不闲聊 提交于 2019-12-04 11:52:24

(比赛前最后的挣扎)

KMP是什么

高效的字符串匹配算法。可以用于查找字符串s中是否含有模式串p。

(剩下的简介自行百度)

思路与实现

万物先从暴力开始

怎样用暴力求出s串中是否含有p串?若含有请输出第一次出现的位置。

暴力就好

比对s[i]是否等于p[j],若等则继续,若不等就让i回到i-j+1位置,j=0继续比对。

这个画个图就很好懂(因为它真的太暴力了)

此时i=j=3 s[i]与p[j]不适配

所以i回到i-j+1 j=0

一直循环直至找到或者i=slen

这个过程一看就十分暴力,怎么优化呢?

观察下图:

其实可以不用移动i,通过移动j来不断比对。

因为ABA中第0位A与第2位A相等,而此时对于S与P的前三个字符又是完全适配的。

所以可以像下图一样移动:

这样就可以节省不少时间。

所以得出大概思路:

先预处理出对于p中任意一个p[i],若不适配,应该向前移动到next[i]的位置,从而实现。

 而对于任意next[j]=k,j表示最大真后缀的结束位置,k表示最大真前缀的结束位置。

举个栗子:

看懂了吗?

不需要知道为什么只需要知道这个东西是啥就行。

为什么一会就知道了hh

好的这究竟是为什么呢?

对于上述模式串:

取第二个A分析,对于该模式串的一个子串

A B C D A

含有最长真前缀 A 和最长真后缀 A

所以对于位置 5 (也就是字符A)next[5]=最长真前缀的结束位置=1(也就是第一个字符A的位置)

所以只要处理出next数组,就可以得知当p[i]与s[j]失配时下一个应该i应该跳到什么地方。

这时屏幕前的你就会打出一个大大的问号:

这究竟是为什么?

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!