如果你有重复的字母,你就会有重复的排列,因为这就是你的逻辑所做的。
例如,与'Hello'
, 为了第一l
,您要添加'l' + perm
对于每个排列'Helo'
,然后对于第二个l
, 你是again adding 'l' + perm
对于每个排列'Helo'
.
有几种方法可以显示没有重复的排列。最简单的就是循环set(strng)
代替strng
:
def allPermutations(strng):
if len(strng) ==1:
return [strng]
perm_list = []
for i in set(strng):
smallerStr = strng.replace(i,"",1)
z = allPermutations(smallerStr)
for t in z:
perm_list.append(i+t)
return perm_list
顺便说一句,你几乎永远不想做这样的事情:
for i in strng:
smallerStr = strng.replace(i,"",1)
… or
for x in lst:
idx = lst.find(x)
除了对已有的内容进行不必要的搜索的明显性能问题之外,如果您有任何重复的元素,它就不可能是正确的。例如,您是否尝试替换/查找/无论第一个'l'
in 'Hello'
或者第二个,它总是会取代第一个。
正确的方法是使用enumerate
。例如:
for idx, i in enumerate(strng):
smallerStr = strng[:idx] + strng[idx+1:]
在这种特殊情况下,它恰好无关紧要,因为您实际上并不关心是否要删除第一个l
或第二个。但是,只有当您经过深思熟虑并确保其正确时,才应该依赖它,并且可能添加一条注释来解释为什么它是正确的。一般来说,不要这样做。