我正在尝试编写一个获取2个字符串和一个整数'k'的函数,并返回两个长度为k的字符串的公共子字符串。 (如果超过1,则随机返回一个)。 网上有很多算法可以检查LONGEST公共子串,但是我没有找到任何检查k长度子串的算法。
我认为哈希表是正确的方法,如果我希望它被优化但我无法得到它。
我只能编写一个函数来检查列表中是否有超过1 k长度的序列。 这是我得到的:
def repeat(st, k):
for i in range(len(st) - k + 1):
for j in range(i + 1, len(st) - k + 1):
if st[i : i + k] == st[j : j + k]:
return st[i : i + k]
return False
我很感激任何帮助......:/
答案 0 :(得分:3)
简单版就是这样:
def common_substr(a, b, k):
for substr in (a[i:i+k] for i in range(len(a)-k+1)):
if substr in b:
return substr
我想,特别是对于非常大的输入字符串(例如兆字节的文本)和大的k
,这可能效率太低,并且建立所有可能的长度为k
的子字符串的哈希值可以提高速度:
def common_substr(a, b, k):
substrs = set(a[i:i+k] for i in range(len(a)-k+1))
for substr in (b[i:i+k] for i in range(len(b)-k+1)):
if substr in substrs:
return substr
但是我想有更聪明的算法可以解决这个问题。即使是相对简单的strstr()
(在字符串中查找字符串)也比每个人都能实现的直接解决方案更有效。
答案 1 :(得分:1)
这绝不是一个有效或聪明的解决方案:
def substrings_of(s, k):
for i in xrange(0, len(s) - k):
yield s[i:i+k]
def common_substr(a, b, k):
for a_s in substrings_of(a, k):
for b_s in substrings_of(b, k):
if a_s == b_s:
return a_s