我有一个长字符串,我不仅试图查找较大字符串中是否存在这些字符的子字符串,而且还试图找到最长的连续实例。
例如,在下面的代码片段中,我发现我可以使用“ count”来查看子字符串b在a中出现多少次。这个结果是5。但是,我要确定的是最长的连续运行,应该是3(其中“ abc”在中间背对背出现)。我很难理解这一逻辑。任何建议,将不胜感激。
a = "abcxyzabcabcabcxyzabcxyz"
b = "abc"
total = a.count(b)
print(total)
使用while循环,这应该非常简单:
def func(a, b):
n = 1
while b*n in a:
n += 1
return n - 1
一种可能且幼稚的解决方案是使用python index
函数来标识子字符串的最接近索引。从那里您可以继续继续向前搜索子字符串,直到找到不再出现的子字符串为止,然后再次调用index
以向前跳过。
示例:
a = "abcxyzabcabcabcxyzabcxyz"
b = "abc"
curr_index = a.index(b)
longest_count = 0
current_count = 0
while curr_index < len(a):
if a[curr_index : curr_index + len(b)] == b:
curr_index += len(b)
current_count += 1
else:
if longest_count < current_count:
longest_count = current_count
try:
curr_index = a.index(b, curr_index)
except ValueError:
# Substring no longer found in string slice
break
current_count = 0
if longest_count < current_count:
longest_count = current_count
print(longest_count)
这只会返回最长的重复计数,但不会返回开始的位置。但是,添加该功能是微不足道的。
用适当的索引继续调用a.index
上的b
。如果索引是子集的开始,那么您将处于同一轮次。否则,开始新的运行:
def longest_run(string, pattern):
longest = 0
current = 0
start = 0
while True:
try:
ind = string.index(pattern, start)
if ind == start:
current += 1
else:
if current > longest:
longest = current
current = 1
start += len(pattern)
except ValueError:
return longest
[一种有效的方法是将re.findall
用于匹配b
一次或多次的模式(使用re.escape
防止b
解释为正则表达式),然后将返回的字符串映射到len
并将它们传递给max
以获取最长匹配的长度,然后将该长度除以b
的长度即可得到重复b
的次数:
import re
max(map(len, re.findall('(?:%s)+' % re.escape(b), a))) // len(b)