在浏览了不同的博客/ 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。有人可以帮我吗?
预先感谢
答案 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