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

时间:2015-01-18 04:17:24

标签: 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];

这种方法缺乏一般性,因为它要求我事先知道排列长度。

示例: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 

任何帮助都将不胜感激。

谢谢,

1 个答案:

答案 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);
    }
}

Demo #2.