生成排列的 C++ 代码
C++ Code to Generate Permutations
我正在尝试编写一个程序来生成重复字符的排列。到目前为止,我有 3 个循环:
for (int f = 0; f < n; f++)
for (int s = 0; s < n; s++)
for (int t = 0; t < n; t++)
newString = characters[f] + characters[s] + characters[t];
这种方法缺乏通用性,因为它需要我事先知道排列长度。
示例:ABC
AAA AAB AAC ABA ABB ABC ACA ACB ACC
BAA BAB BAC BBA BBB BBC BCA BCB BCC
CAA CAB CAC CBA CBB CBC CCA CCB CCC
如有任何帮助,我们将不胜感激。
谢谢,
如果你需要排列(你的例子不是排列),C++ 标准库有一个完美的函数 - std::next_permutation
:
string s("ABC");
do {
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
请注意,必须对进入此循环的第一次迭代的范围进行排序,以便生成完整的排列列表 (Demo #1)。
您的示例生成了一组字符的所有重复组合。您可以像以前一样使用嵌套循环或递归来完成此操作:
void combinations(const string& s, vector<int>& pos, int n) {
if (n == s.size()) {
for (int i = 0 ; i != n ; i++) {
cout << s[pos[i]];
}
cout << endl;
return;
}
for (int i = 0 ; i != s.size(); i++) {
pos[n] = i;
combinations(s, pos, n+1);
}
}
我正在尝试编写一个程序来生成重复字符的排列。到目前为止,我有 3 个循环:
for (int f = 0; f < n; f++)
for (int s = 0; s < n; s++)
for (int t = 0; t < n; t++)
newString = characters[f] + characters[s] + characters[t];
这种方法缺乏通用性,因为它需要我事先知道排列长度。
示例:ABC
AAA AAB AAC ABA ABB ABC ACA ACB ACC
BAA BAB BAC BBA BBB BBC BCA BCB BCC
CAA CAB CAC CBA CBB CBC CCA CCB CCC
如有任何帮助,我们将不胜感激。
谢谢,
如果你需要排列(你的例子不是排列),C++ 标准库有一个完美的函数 - std::next_permutation
:
string s("ABC");
do {
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
请注意,必须对进入此循环的第一次迭代的范围进行排序,以便生成完整的排列列表 (Demo #1)。
您的示例生成了一组字符的所有重复组合。您可以像以前一样使用嵌套循环或递归来完成此操作:
void combinations(const string& s, vector<int>& pos, int n) {
if (n == s.size()) {
for (int i = 0 ; i != n ; i++) {
cout << s[pos[i]];
}
cout << endl;
return;
}
for (int i = 0 ; i != s.size(); i++) {
pos[n] = i;
combinations(s, pos, n+1);
}
}