打印字符串 C++` 的所有组合

Printing all combinations of a string C++`

问题:给定一个 string x, sort 然后 打印所有组合。 (在 hackerrank/interviewbit/geeksforgeeks 等编码网站上找到)

这是一个例子...

输入:字符串 x = "BAC"

输出:[ABC、AB、AC、BC、A、B、C]

当前工作解决方案:(仅适用于 x.length() = 3 的情况)

void printCombinations(string q){
    stack<char> c;
    stack<char> c2;
    sort(q.begin(), q.end());
    for(int i = 0; i<q.size(); i++){
        cout<<q[i];
        c.push(q[i]);
    }
    cout<<endl;

    for(int i = 0; i<q.size(); i++){
      char t = c.top();
      cout<<t<<endl;
      for(int j=0; j<c.size(); j++){
        c.pop();
        c2.push(c.top());
        cout<< t << c.top() <<endl;
      }
      c.pop();
      c = c2;
    }
}

我不确定为什么您的问题中发布的代码仅适用于 three-character 字符串,但是它存在一些问题(例如,您无需访问堆栈)。

这可以通过将 string 转换为 char 数组并遍历来解决。 可以找到与您所追求的代码类似的代码 here,同一页面还给出了解决方案的名称 (backtracking) 和一个漂亮的小图表,解释了它如何使用字符串 ABC 举个例子:


(来源:geeksforgeeks.org

然而,这段代码并没有按照您的意愿执行 'out of the box',但是对代码稍加修改就可以执行:

代码中某处有一个小错误,导致结果输出奇怪的字符,但是 确实 打印出所有组合。 正在研究这个问题,当我有解决方案时会更新代码。

void swap(char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}


void permute(char *a, int i, int n)
{
    int j;
    if (i == n)
        std::cout << string(a);
    else
    {
        for (j = i; j <= n; j++)
        {
            swap((a + i), (a + j));
            permute(a, i + 1, n);
            swap((a + i), (a + j)); //backtrack
        }
    }
}

int main()
{
    char a[] = "BAC";
    int len = sizeof(a) / sizeof(a[0]);
    permute(a, 0, len);
    getchar();
    return 0;
}
    void printCombinations(string q){
    cout<<"We are now printing out all the combinations of "<<q<<endl;
    sort(q.begin(), q.end());
    bitset<10> b;
    int count =0;
    for(int i=0; i<pow(2,q.size()); ++i){
        for(int x=0;x<10;x++){
            if(b[x] == 1){
                cout<<q[x]; 
            }
        }
        count++;
        cout<<endl;
        for( int j=0; j<10;j++){
            if(b[j]==1){
                b[j].flip();
            }
            else{
                b[j].flip();
                break;
            }
        }
    }   
    cout<<"There are "<<count<<" combinations"<<endl;
}

这是上述问题的一种解决方案。

另一种打印给定字符串的所有组合的解决方案。我在代码中给出了注释,解释了每一行的作用。

void combination(int index, string instr, string outstr)
{
    for (auto i = index; i < instr.length(); i++)
    {
        outstr += instr.at(i);             // 1: Append a char
        cout<<outstr << " ";               // 2: Print the current combination
        combination(i + 1, instr, outstr); // 3: Recursive call at level i + 1
        outstr.erase(outstr.length() - 1, 1); // 4: Balance/Remove the char added at step 1
    }
}

int main()
{
    combination(0, "ABC","");
    return 0;
}

输出:

A AB ABC AC B BC C