【问题标题】:Using hashing to find a repeated substring inside a string使用散列在字符串中查找重复的子字符串
【发布时间】:2014-11-04 22:45:34
【问题描述】:

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

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")

【问题讨论】:

    标签: python string substring


    【解决方案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
    

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

    不过还有一些 cmets:

    • 如果您没有找到任何东西,您应该返回 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
    

    【讨论】:

    • 最好使用setdefault(或者使用defaultdict而不是dict——或者,在这种情况下,使用Counter)而不是显式检查in并分配@987654335 @。它更简单、更易读、更简洁、更高效;几乎在每个类别中都获胜。 (否则,很好的答案。)
    【解决方案2】:

    你快到了

    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, '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':1,'bcdb ': 1, 'bcd': 1, 'abcdb': 1, 'bca': 1, 'bcdbca': 1}

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2020-02-24
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多