字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多。至于选择哪一种字符串匹配算法,在不同的场景有不同的选择。

在我们平时文档里的字符查找里

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


采用的就是 Boyer-Moore 匹配算法了,简称BM算法。这个算法也是有一定的难度,不过今天,我选用一个例子,带大家读懂这个字符串匹配 BM 算法,看完这篇文章,保证你能够掌握这个算法的思想。

首先我先给出一个字符串和一个模式串

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

接下来我们要在字符串中查找有没有和模式串匹配的字串,步骤如下:

坏字符

1、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


和其他的匹配算法不同,BM 匹配算法,是从模式串的尾部开始匹配的,所以我们把字符串和模式串的尾部对齐。

显然,从图中我们可以发现,s 和 e 并不匹配。这时我们把“s” 称之为坏字符,即代表不匹配的字符。而且我们可以发现,s 和模式串中的任意一个字符都不匹配,所以这时,我们可以直接把模式串移动到 s 的后面。

2、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

从图中可以看出,此时 p 和 e 不匹配,所以 p 是一个坏字符,不过,我们可以发现 “p” 包含在模式串中

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

所以,我们不能像第一步那样,把模式串直接全部移到 p 的后面去,而是移动两位,让两个 p 对齐。

4、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

那么问题来了,当我们碰到碰到坏字符的时候,该移动几位呢?
下面我和大家讲一下这个问题,首先我们要算出模式串中两个字符的下标。这两个字符分别是

(1)模式串中与坏字符对应的那个字符的下标,在我们上面那个例子中,就是 e。

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


显然,这个 e 的下标是 6(从0开始算起)。我们用变量 t1 来代表这个字符的下标吧。

(2)坏字符在模式串中的下标,在我们上面那个例子中,坏字符在模式串中的下标为 4,我们用变量 t2 来代表这个下标,如图

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

找出这两个字符的下标之后,我们就可以计算移动的位数了

移动的位数 = t1 - t2。

例如上面的例子步骤 2 中 t1 = 6, t2 = 4,所以移动了 t1 - t2 = 2 位。

(1)这个时候可能有人会问了,那如果模式串中有多个 p 呢?

答是如果有多个,我们只计算最右边的那个(当然是移动的位数越少越安全了)

(2)可能又有人会问,那如果模式串中并不存在坏字符呢?例如步骤1

答是如果不存在的话,我们把 t2 赋值为 -1,即 t2 = -1。所以我们步骤 1 中移动了 t1 - t2 = 6 - (-1) = 7 位。

好了,现在我们已经解决了遇到坏字符之后,应该移动多少位的问题了。

好后缀

我们继续匹配

5、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


匹配,所以继续匹配前面的字符

6、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


匹配,继续匹配前面的字符

7、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


匹配,继续匹配前面的字符

8、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


匹配,继续匹配前面的字符

9、

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!


遇到坏字符 i,按照我们前面的规则,可以计算出 t1 = 2(就是a的下标)。t2 = -1(因为模式串不存在坏字符)。所以移动的位数是 t1 - t2 = 3。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdwjs.html