我需要为应用程序生成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

附加的测试可能不是判断一个字母是否已经被使用的最有效的方法,但是在您的情况下,对于许多重复的字母,它将节省大量的递归。

09-25 21:21