长度为k的公共子串

时间:2013-05-08 18:38:01

标签: python substring

我正在尝试编写一个获取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

我很感激任何帮助......:/

2 个答案:

答案 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