我正在尝试编写一个程序,该程序将生成重复字符的排列。到目前为止,我有 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];
Run Code Online (Sandbox Code Playgroud)
这种方法缺乏通用性,因为它需要我事先知道排列长度。
示例: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
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
谢谢,
如果你需要排列(你的例子不是排列),C++ 标准库有一个完美的功能 - std::next_permutation:
string s("ABC");
do {
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
Run Code Online (Sandbox Code Playgroud)
请注意,必须对进入此循环的第一次迭代的范围进行排序,以生成完整的排列列表(演示 #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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7568 次 |
| 最近记录: |