考虑到问题:在字符串中查找重复的子字符串,是否可以使用散列?我想创建一个字典,子字符串作为键,重复实例的数量作为值。这是我到目前为止所拥有的。我收到一个错误,因为我使用子字符串作为字典的键。谁能发现我的错误?谢谢!!!
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")
答案 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
直到字符串结尾。所以:
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 }