使用散列在字符串中查找重复的子字符串

时间:2014-11-04 22:45:35

标签: python string substring

考虑到问题:在字符串中查找重复的子字符串,是否可以使用散列?我想创建一个字典,子字符串作为键,重复实例的数量作为值。这是我到目前为止所拥有的。我收到一个错误,因为我使用子字符串作为字典的键。谁能发现我的错误?谢谢!!!

def findsubs(str):
  d={}
  for i in range(len(str)-1):
    for j in range(i+2, len(str)-2):
      if d[str[i:j]]>1:
        return str[i:j]
      else:
        d[str[i:j]] = d[str[i:j]] +1

   return 0

打印findsubs(" abcbc")

2 个答案:

答案 0 :(得分:1)

一般的想法应该有效。只是如果在执行查找时在字典中找不到某个键,则会出现错误 - 因此您必须在执行查找之前检查该键是否存在,如果不存在则进行初始化:

def findsubs(str):
  d={}
  for i in range(len(str)-1):
    for j in range(i+2, len(str)-2):
      if str[i:j] not in d:
        d[str[i:j]] = 0

      if d[str[i:j]]>1:
        return str[i:j]
      else:
        d[str[i:j]] = d[str[i:j]] +1

   return 0

请注意,代替if str[i:j] not in d: d[str[i:j]] = 0,您可以执行d.setdefault(str[i:j], 0),如果密钥不在dict中,则将值设置为0,如果密钥不存在则保持不变。

还有一些评论:

  • 如果找不到任何内容,则应返回None,而不是0
  • 您不应该调用变量str,因为这是一个内置函数。
  • 您希望迭代j直到字符串结尾。
  • 如果已经找到3次,它只会返回一个子字符串。实际上你可以使用一组先前找到的子串来重写它:

所以:

def findsubs(s):
  found = set()
  for i in range(len(s)-1):
    for j in range(i+2, len(s)+1):
      substr = s[i:j]
      if substr in found:
        return substr
      found.add(substr)

  return None

答案 1 :(得分:0)

你几乎就在那里

def findsubs(instr):
  d={}
  for i in range(len(instr)):
    for j in range(i+2, len(instr)+1):
      print instr[i:j]
      d[instr[i:j]] = d.get(instr[i:j],0) + 1
  return d      

instr = 'abcdbcab'
print instr
print findsubs('abcdbcab')

这样可行,我添加了一个内部打印用于调试目的,在测试后将其删除。

结果是你要求的子字符串计数的dict:)

{' abcd':1,' ab':2,' cdb':1,' dbc':1,&# 39; cdbcab':1,' cd':1,' abc':1,' cdbc':1,' bcab' :1,' abcdbc':1,' ca':1,' db ca':1,' bc':2,' dbcab':1,' db':1,' cab':1 ,' bcdbcab':1,' bcdbc':1,' abcdbca':1,' cdbca':1,' abcdbcab& #39;:1,' bcdb ':1,' bcd':1,' abcdb':1,' bca':1,' bcdbca':1 }