Algorithm 如何在不重复一组字母的所有组合的情况下获得排列?

Algorithm 如何在不重复一组字母的所有组合的情况下获得排列?,algorithm,math,combinations,permutation,Algorithm,Math,Combinations,Permutation,我试图创建一个算法,在给它一些随机字母后,例如:abcd,它会显示所有可能的排列,在这种情况下,答案是: abc abd abd acd ab ac ad a bcd bc bd b cd c d 正如你所看到的,不同的排列必须有不同的字母,我花了几个小时试图做到这一点,但没有成功,这就是我到目前为止所做的: vector<char> letters; letters.push_back('a'); letters.push_back

我试图创建一个算法,在给它一些随机字母后,例如:abcd,它会显示所有可能的排列,在这种情况下,答案是:

abc abd abd acd ab ac ad a bcd bc bd b cd c d

正如你所看到的,不同的排列必须有不同的字母,我花了几个小时试图做到这一点,但没有成功,这就是我到目前为止所做的:

        vector<char> letters;

        letters.push_back('a');
        letters.push_back('b');
        letters.push_back('c');
        letters.push_back('d');

        int number_of_letters = 4;
        int number_of_repetitions;
        vector<char> combination;
        vector<char> comb_copy;

        for(int i = 0; i < number_of_letters; i++){
            number_of_repetitions = 1;
            changing_letters = number_of_letters - (i + 1);

            for(int j = i+1; j < number_of_letters; j++){
                combination.push_back(letters[j]);
            }


            comb_copy = combination;

            for(int i = 0; i < comb_copy.size(); i++){
                cout << comb_copy[i];
            }

            while(number_of_repetitions <= changing_letters){
                comb_copy = combinations(comb_copy, number_of_repetitions);

                for(int i = 0; i < comb_copy.size(); i++){
                    cout << comb_copy[i];
                }

                comb_copy = combination;
                number_of_repetitions++;
            }
        }




vector<char> combinations(vector<char> combi, int reps){

    combi.erase(combi.end() - reps);

    return (reps > 1?combinations(combi, reps-1):combi);
}
我需要得到:

abcd abc abd acd ab ac ad a bcd bc bd b cd c d
有人能帮我吗?:)


谢谢

您希望获得n个项目的所有子集,除了空的一个。有
2^n-1
这样的子集。生成它们的一对方法:

1) 对范围
1..2^n-1
中的值R进行循环。每一步用二进制表示R。R的每个非零位对应于结果中使用的初始数组的索引。例如,
R=5=0101b
表示“ac”(第0个和第2个元素)

2) 使用递归过程,在每一级进行两次递归调用—使用当前索引添加elelent,然后省略它。最深级别的输出结果(如果不为空)

Python示例:

s = "abcd"
n = len(s)
for r in range(1, 1<<n):
    result = ""
    for i in range(n):
        if r & (1 << i):
            result += s[i]
    print(result, end = " ")

a b ab c ac bc abc d ad bd abd cd acd bcd abcd 

def subs(s, result, idx):
    if idx == len(s):
        if len(result) > 0:
            print(result, end = " ")
    else:
        subs(s, result + s[idx], idx + 1)
        subs(s, result, idx + 1)

subs("abcd", "", 0)

abcd abc abd ab acd ac ad a bcd bc bd b cd c d
s=“abcd”
n=长(s)

对于范围内的r(1,1请解释您将得到的结果与您期望的结果进行比较。您所做的不仅仅是排列!您正在创建子集,然后对每个子集进行排列。如果您使用两种不同的方法,然后将它们组合起来,您可能会得到您所寻求的结果。此外,您的测试用例在哪里?您不是在寻找排列但是对于codeMagic,我已经用我得到的结果对它进行了更新,结果是need@NicoSchertler这是非常有用的,唯一的一点是,在那篇文章中,他们从n中得到了k元素的所有组合,我需要它来给我从k到1元素的k元素的所有组合
s = "abcd"
n = len(s)
for r in range(1, 1<<n):
    result = ""
    for i in range(n):
        if r & (1 << i):
            result += s[i]
    print(result, end = " ")

a b ab c ac bc abc d ad bd abd cd acd bcd abcd 

def subs(s, result, idx):
    if idx == len(s):
        if len(result) > 0:
            print(result, end = " ")
    else:
        subs(s, result + s[idx], idx + 1)
        subs(s, result, idx + 1)

subs("abcd", "", 0)

abcd abc abd ab acd ac ad a bcd bc bd b cd c d