字符串匹配算法(二)-BM算法详解 (2)

     所以,当模式串滑动到前缀与主串中{u}的后缀有部分重合的时候,并且重合的部分相等的时候,就有可能会存在完全匹配的情况。针对这种情况,我们不仅要看好后缀在模式串中,是否存在另一个匹配的子串。我们还要考察好后缀的后缀子串,是否和模式串的前缀子串相匹配。

      这里我们再来解释一下字符串的后缀子串和前缀子串。所谓字符串A的后缀子串,就是最后一个字符跟A对齐的子串,比如,字符串abc的后缀子串是c、bc。所谓的前缀子串,就是起始字符和A对齐的子串。比如,字符串abc的前缀子串是a、ab。我们从好后缀子串中,找一个最长并且能和模式串前缀子串匹配的,假如是{v}。然后滑动到如图所示的位置。

字符串匹配算法(二)-BM算法详解

       到目前位置,我们的坏字符和好后缀就讲完了,我们接下来想这么一个问题。当模式串和主串中某个字符不匹配的时候,我们是选好后缀规则呢还是坏字符规则来计算向后滑动的位数呢?

       我们可以分别计算坏字符规则和好后缀规则向后滑动的位数,然后取两个数的最大的,作为模式串往后滑动的位数。

BM算法的代码实现

         我们接下来来看BM算法的代码是如何实现的。

         "坏字符规则"中当遇到坏字符时,我们要计算后移的位数Ai-Bi,其中Bi的计算的重点。如果我们拿坏字符在模式串中顺序查找,这样是可以实现,不过效率比较低下。我们可以用大小256的数组,来记录每个字符在模式串中出现的位置。数组的下标对应的是字符的Ascii编码,数组中存储的是这个字符在模式串中的位置。

SIZE = 256 def generateBC(b, m): bc=[-1]*SIZE for i in range(m): accii=ord(b[i]) bc[accii]=i return b

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

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