使用Boyer Moore算法的重复字符串匹配关联

时间:2018-07-09 03:39:20

标签: python algorithm search data-structures substring

在浏览了不同的博客/ SO问题后仍然找不到答案后发布了该问题

我正在努力围绕leetcode竞赛使用的解决方案/算法。

这是问题:

  

给出两个字符串A和B,找出必须重复的最小次数,以使B是它的子字符串。如果没有这样的解决方案,则返回-1。

     

例如,使用A =“ abcd”和B =“ cdabcdab”。

     

返回3,因为重复3次(“ abcdabcdabcd”),B是它的子字符串;并且B不是重复两次的A的子字符串(“ abcdabcd”)。

我知道滚动哈希方法是首选方法,但我决定从博耶·摩尔方法开始。

经过一些研究,我了解到以下代码在幕后使用了Boyer Moore算法。这是代码:

def repeatedStringMatch(self, A, B):
    """
    :type A: str
    :type B: str
    :rtype: int
    """
    m = math.ceil(len(B)/len(A))
    if B in A * m:
        return m
    elif B in A * (m + 1):
        return m + 1
    else:
        return -1

基于对算法的理解,我不相信上述解决方案可能会使用BM方法。

我不清楚这行是什么

  m = math.ceil(len(B)/len(A)) 

确实如此,为什么我们必须以这种方式找到m。有人可以帮我吗?

预先感谢

1 个答案:

答案 0 :(得分:1)

较小的字符串必须至少重复 m次才能包含较大的字符串。

m可以假定的最小值是大于两个字符串的长度之比(较大/较小)的最小整数,因为包含一个长度为l的子字符串必须至少具有l的长度。

使用您共享的示例。

A = "abcd"
B = "cdabcdab"
m0 = len(B) / len(A)
# m0 == 2.0
m = math.ceil(m0)
# m = 2

但是,"cdabcdab"中没有包含"abcdabcd"。但是,如果再重复1次“ abcd”,则会发现"cdabcdab"是子字符串。进一步重复“ abcd”不会改变它是否可以作为子字符串找到。因此,仅需要检查是否包含m(m+1)重复项。

您共享的python代码没有实现任何搜索算法,它仅使用实现与in一起使用的任何搜索算法。具体算法可能取决于实现方式,但是由于流行且有效,因此很有可能成为波伊尔摩尔或它的变体。

编辑:

B in A背后的算法似乎是boyer-moore in cpython