字符串匹配

字符串匹配

s(目标串)中找到t(模式串)

一、暴力匹配(BT算法)

进行匹配,如果不匹配,把模式串向后挪一位,继续从模式串的开头进行匹配

 

A E 不匹配,后移。

 

一直到匹配,或者超出目标串肯定不匹配。

 

代码实现:

 

但是这种比较方法非常低效

 

看上边的例子,C B不匹配了,按照之前的思想,应该模式串向后移动一格,但是,经过我们第一次的比较已经知道后边有一个AB,和模式串的开头的AB匹配,为什么模式串的开头不可以直接移动到A的下边呢?

 

故此引入KMP算法,让指针不回溯,快速匹配。

目的:让其不溯回,直接移动到目标串的第二个AB

首先,我们继续观察第一个图,也就是下边的。

 

 

 

 

 

 

第一次匹配中,CB不匹配时,他们之前都是匹配的,正好匹配过的目标串中第二个AB与模式串的开头相同(不管后边,因为后边的不知道,还未匹配)

12匹配,13我们也知道是匹配的(目标,还未实现),所以23也是相同的吧,唉?发现了叭,23相同,我们就能把3移动到1的地方。

 

23相同呢,他们就是模式串中不匹配的B前边字符串的相同前缀和后缀。

如下ABCAB

 

(注意后缀都顺序,还是正着来的哦)

所以,我们让计算机知道模式串每一个字母前的最长相同前缀和后缀,,当一个字母不匹配了,知道这个字母最长相同前缀和后缀,就能让它移动到我们想的位置。

 

 

 

 

看上边的模式串q[5],   q[0] = -1,前边没有,规定为-1,而且方便之后计算。找出最长相同前缀和后缀即可

问题是每个字符串不同,怎么让计算机自己算出来的,故此我们先给出代码进行分析,

 

由结果入手,上边的例子中, 我们每求一个字符的nextt时,我们已经知道其前边的字符的nextt了叭,以q[4]为例;我们知道q[3]nextt,1,所以,q[0] 和去q[2]  是相同的,我们只要比较q[2]q[3]  是不是相同,相同就在  next[3] +1   如果不同呢,j就看next [ next [ 3 ] ]

   

如上,假如求next[ 17 ], 16 8 不相同,我们需要看next [ 8 ] next [ 8 ] = 3   我们就看3 16 相不相同,以此类推。

完整代码:

 

posted @ 2022-10-24 10:36  焦糖玛奇果  阅读(83)  评论(0)    收藏  举报