擅长:python、mysql、java
<p>如果你有重复的字母,你会有重复的排列,因为这就是你的逻辑所做的。在</p>
<p>例如,使用<code>'Hello'</code>,对于第一个<code>l</code>,为<code>'Helo'</code>的每个排列添加<code>'l' + perm</code>,然后对于第二个<code>l</code>,再次<em>为<code>'Helo'</code>的每个排列添加{<cd3>}。在</p>
<p>有几种方法可以显示不重复的排列。最简单的方法是循环<code>set(strng)</code>而不是<code>strng</code>:</p>
<pre><code>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
</code></pre>
<hr/>
<p>顺便说一句,你几乎不想做这样的事情:</p>
^{2}$
<p>…或</p>
<pre><code>for x in lst:
idx = lst.find(x)
</code></pre>
<p>除了明显的性能问题,即不必要地搜索已有的内容之外,如果有任何重复的元素,就不可能是正确的。例如,无论您尝试替换<code>'Hello'</code>中的第一个<code>'l'</code>还是第二个,它都将始终替换第一个。在</p>
<p>正确的方法是使用<code>enumerate</code>。例如:</p>
<pre><code>for idx, i in enumerate(strng):
smallerStr = strng[:idx] + strng[idx+1:]
</code></pre>
<p>在这个特定的例子中,这并不重要,因为您实际上并不关心您是删除第一个<code>l</code>还是第二个。但是,只有经过深思熟虑并确保它是正确的,并可能添加一条解释为什么是正确的注释时,才应该依赖于它。一般来说,就是不要这么做。在</p>