用于生成排列的 C++ 代码

sid*_*y3d 4 c++ permutation

我正在尝试编写一个程序,该程序将生成重复字符的排列。到目前为止,我有 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)

任何帮助,将不胜感激。

谢谢,

das*_*ght 5

如果你需要排列(你的例子不是排列),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)

演示#2。