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