簡體   English   中英

使用哈希在字符串中查找重復的子字符串

[英]Using hashing to find a repeated substring inside a string

解決了問題:在字符串中找到重復的子字符串,是否可以使用哈希? 我想創建一個字典,將子字符串作為鍵,並將重復實例的數量作為值。 這是我到目前為止所擁有的。 我收到錯誤消息是因為我正在使用子字符串作為字典的鍵。 誰能發現我的錯誤? 謝謝!!!

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

總體思路應該可行。 只是,如果在執行查詢時未在字典中找到鍵,則會出現錯誤-因此您必須在執行查詢之前檢查鍵是否存在,如果沒有,則進行初始化:

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) ,將值設置為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

你快到了

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

這將起作用,我為調試目的添加了一個內部打印,在測試之后將其刪除。

結果是您要求的帶有子字符串計數的字典:)

{'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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM