我正在尝试解决一个问题,该问题提供字符串作为输入并提供可能的字谜数量作为输出。这可以使用字典解决,但我只能考虑for循环和字符串索引。
count = 0
for i in range(1,len(s)):
for j in range(0,len(s)):
for k in range(j+1,len(s)):
if(k+i>len(s)):
continue
# print(list(s[j:j+i]),list(s[k:k+i]),j,j+i,k,k+i)
if(sorted(list(s[j:j+i]))==sorted(list(s[k:k+i]))):
count +=1
return count
我到目前为止已经编码,并尝试使用k + i进行优化。有人可以告诉我其他技术来优化代码而不丢失逻辑。代码会因较大的字符串超时而不断被终止。我应该将sorted
函数替换为其他函数。
答案 0 :(得分:2)
如果每个字母都是唯一的,则字谜的数量为n!
,其中n
为字符串的长度(例如,法律中有3!=6
)。如果给定字母重复两次(例如,wall
),那么答案将是您应有的两倍(因为w-(second l)-(first l)-a
之类的东西与w-(first l)-(second l)-a
之类的东西实际上是无法区分的)。事实证明,如果一个字母重复k
次({{1}中的字母k
的{{1}}是2),则"l"
的计数将增加{ {1}}。对于每个重复的字母都是如此。
因此,要获得字谜的数量,您可以执行以下操作:
wall
实施n!
和k!
留给读者作为练习:-)。注意:请注意,重复出现的字母可能会出现多次,而并不总是彼此相邻。例如:“ aardvark”应该为“ a”返回3的计数,为“ r”返回2的计数,其他所有计数都返回1。