我正在尝试编写一个程序,该程序将生成重复字符的排列。到目前为止,我有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
任何帮助都将不胜感激。
谢谢,
答案 0 :(得分:2)
如果您需要排列(您的示例不是排列),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);
}
}