Algorithm 扩展置换算法(包括重复)

Algorithm 扩展置换算法(包括重复),algorithm,combinations,permutation,Algorithm,Combinations,Permutation,我在寻找一种算法,它能给出所有可能的字母组合 让我解释清楚。如果我有 base-letters = ["a","b","c"]; depth = 2; //max chars allowed 那么预期结果将是这12个元素(3^1+3^2=12): 如果深度值为3,则预期(3^1)+(3^2)+(3^3)=39个元素 ["a", "b", ... , "aa", "ab", ... , "aaa", "aab", ..., "aba", ...] 现在,如果我理解正确,排列算法是相似的,但不考

我在寻找一种算法,它能给出所有可能的字母组合

让我解释清楚。如果我有

base-letters = ["a","b","c"];
depth = 2; //max chars allowed
那么预期结果将是这12个元素(3^1+3^2=12):

如果深度值为3,则预期(3^1)+(3^2)+(3^3)=39个元素

["a", "b", ... , "aa", "ab", ... , "aaa", "aab", ..., "aba", ...]

现在,如果我理解正确,排列算法是相似的,但不考虑<强>重复的< /强>字母(如“AA”、“BB”、“AAB”、“ABA”),以及<强>可变深度< /强>值(它可以与基字母长度不同)。它接受一个长度小于或等于最大长度的字符串s,并从调用F(s)开始,其中s等于空字符串。函数F计算字符串的长度,如果它等于最大长度,则打印字符串s并返回。如果字符串的长度小于最大值,则F(s)打印出字符串s,然后迭代字母表中所有可能的字母,对于每个字母,它将字母添加到字符串s的末尾,以生成长度为1的字符串s',然后调用F(s')。这具有非常低的内存使用率,基本上是可能的最快方法,至少在渐进方面是如此。

在Python中,使用(如果需要将代码翻译为母语,则包含代码配方)

如果您只需要唯一的值,则创建一个集合,而不是将每个输出元素连接到一个字符串中。这将删除重复项。然后从最终集合中删除重复项

>>> result = frozenset([frozenset(element)
                        for element in itertools.chain.from_iterable(
                          [itertools.permutations(base_elements, depth)
                           for depth in range(1, max_depth+1)]
                        )])
或者更干净一些

def permutations(base_elements, max_depth):
    result = set()
    for depth in range(1, max_depth+1):
        for element in itertools.permutations(base_elements, depth):
            result.add(frozenset(element))
    return result

这段代码似乎可以满足您的需求:

def all_strs(iterable, depth):
    results = []
    if depth==1:
        for item in iterable:
            results.append(str(item))
        return results
    for item in iterable:
        for s in all_strs(iterable, depth-1):
            results.append(str(item) + s)
    return results

if __name__ == "__main__":
    print all_strs('abc', 2)
    print all_strs([1, 2, 3], 3)

    s = 'abc'
    results = []
    for i in range(len(s)):
        results += print all_strs(s, i+1)
    print results
输出为: ['aa','ab','ac','ba','bb','bc','ca','cb','cc']

['111',112',113',121',122',123',131',132',133',211',212',213',221',222',223',231',232',233',311',312',313',321',322',323',331',332',333']


['a',b',c',aa',ab',ac',ba',bb',bc',ca',cb',cc',aaa',aab',aac',aba',abb',abc',aca',acb',acc',baa',bab',bac',bba',bbb',bbc',bca',bcc',cba',cbb',cbc',ccb',ccc'.][/p>这可以使用递归完成。
def permutations(base_elements, max_depth):
    result = set()
    for depth in range(1, max_depth+1):
        for element in itertools.permutations(base_elements, depth):
            result.add(frozenset(element))
    return result
def all_strs(iterable, depth):
    results = []
    if depth==1:
        for item in iterable:
            results.append(str(item))
        return results
    for item in iterable:
        for s in all_strs(iterable, depth-1):
            results.append(str(item) + s)
    return results

if __name__ == "__main__":
    print all_strs('abc', 2)
    print all_strs([1, 2, 3], 3)

    s = 'abc'
    results = []
    for i in range(len(s)):
        results += print all_strs(s, i+1)
    print results