我需要为应用程序生成anagrams我正在使用以下代码生成anagram
def anagrams(s):
if len(s) < 2:
return s
else:
tmp = []
for i, letter in enumerate(s):
for j in anagrams(s[:i]+s[i+1:]):
tmp.append(j+letter)
print (j+letter)
return tmp
上面的代码是通用的但是,当传递以下字符串时,它将打印无限结果
str = "zzzzzzziizzzz"
print anagrams(str)
有人能告诉我哪里出错了吗我需要一个字符串的唯一anagrams
最佳答案
其他人指出,你的代码产生13!字谜,很多都是重复的。你的11个z和2个i的字符串只有78个唯一的anagrams(那是13!/(11!·2!)或13.12/2.)
如果只需要这些字符串,请确保不会为同一个字母多次向下递归:
def anagrams(s):
if len(s) < 2:
return s
else:
tmp = []
for i, letter in enumerate(s):
if not letter in s[:i]:
for j in anagrams(s[:i] + s[i+1:]):
tmp.append(letter + j )
return tmp
附加的测试可能不是判断一个字母是否已经被使用的最有效的方法,但是在您的情况下,对于许多重复的字母,它将节省大量的递归。