(比赛前最后的挣扎)
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应该跳到什么地方。
这时屏幕前的你就会打出一个大大的问号:
这究竟是为什么?