这有点蹩脚,但一种“蛮力”的方法是只检查是否存在可能的最长子字符串。一旦找到子字符串,就跳出循环:
编辑 - 使用函数可能更直接:
def get_longest_repeating_pattern(string, pattern):
if not pattern:
return ""
for i in range(len(string)//len(pattern), 0, -1):
current_pattern = pattern * i
if current_pattern in string:
return current_pattern
return ""
string = "JOKHCNHBVDBVDBVDJHGSBVDBVD"
pattern = "BVD"
longest_repeating_pattern = get_longest_repeating_pattern(string, pattern)
print(len(longest_repeating_pattern))
编辑 - 解释:
首先,只是一个简单的 for 循环,它从一个较大的数字开始,一直到一个较小的数字。例如,我们从 5 开始向下到 0(但不包括 0),步长为 -1:
>>> for i in range(5, 0, -1):
print(i)
5
4
3
2
1
>>>
如果string = "JOKHCNHBVDBVDBVDJHGSBVDBVD",那么len(string)就是26,如果pattern = "BVD",那么len(pattern)就是3。
回到我原来的代码:
for i in range(len(string)//len(pattern), 0, -1):
插入数字:
for i in range(26//3, 0, -1):
26//3 是一个整数除法,产生8,所以变成:
for i in range(8, 0, -1):
所以,这是一个从 8 到 1 的 for 循环(请记住,它不会下降到 0)。 i 每次迭代都采用新值,首先是 8 ,然后是 7 ,等等。
在 Python 中,您可以“乘”字符串,如下所示:
>>> pattern = "BVD"
>>> pattern * 1
'BVD'
>>> pattern * 2
'BVDBVD'
>>> pattern * 3
'BVDBVDBVD'
>>>