如何使用重复字符生成排列

时间:2013-07-29 21:34:11

标签: c++ algorithm g++ permutation

我基本上想要创建由三个操作符号组成的字符串(例如:+-*++/+++)。这些字符串中的每一个都应该被推送到vector <string> opPermutations 到目前为止,这是我的代码:

 // Set up permutations for operators

string operatorBank[4] = {"+","-","*","/"};

 do {

    string currentPerm = operatorBank[0] + operatorBank[1] + operatorBank[2] + operatorBank[3];

    this -> opPermutations.push_back(currentPerm);

} while ( std::next_permutation(operatorBank, operatorBank + 4) );

推入向量(作为字符串)的排列是:

+-*/                                                                                                                                                                                           
+-/*                                                                                                                                                                                           
+/*-                                                                                                                                                                                           
+/-*                                                                                                                                                                                           
-*+/                                                                                                                                                                                           
-*/+                                                                                                                                                                                           
-+*/                                                                                                                                                                                           
-+/*                                                                                                                                                                                           
-/*+                                                                                                                                                                                           
-/+*                                                                                                                                                                                           
/*+-                                                                                                                                                                                           
/*-+                                                                                                                                                                                           
/+*-                                                                                                                                                                                           
/+-*                                                                                                                                                                                           
/-*+                                                                                                                                                                                           
/-+*  

我想要的是让我的排列存在这样:

  • 每个长度应为三个字符
  • 必须存在所有可能的排列,包括重复一次以上字符的排列。

我希望它如此组织:

+++
---
*** 
/// 
/*/
+-+
++*
**/

etc...

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

使用递归打印您提出的问题。使其适应在向量中存储置换字符串应该是微不足道的。我不是c ++程序员,所以在C ++中可能有更好的方法。但这里的主要思想是使用递归。

    #include <iostream>
    #include <string>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;

    void displayPermutation(string permutation[], int length){
        int i;
        for (i=0;i<length;i++){
            cout<<permutation[i];
        }
        cout << endl;
    }

    void getPermutations(string operatorBank[], int operatorCount, 
            string permutation[],int permutationLength, int curIndex){
        int i;
        //stop recursion condition
        if(curIndex == permutationLength){
            displayPermutation(permutation,permutationLength);
        }
        else{
            for(i = 0; i < operatorCount; i++){
                permutation[curIndex] = operatorBank[i];
                getPermutations(operatorBank,operatorCount,permutation,
                    permutationLength,curIndex+1);
            }
        }
    }

    int main ()
   {
       int operatorCount = 4;
       int permutationLength = 3;
       string operatorBank[] = {"+","-","*","/"};
       string permutation[] = {"","","",""}; //empty string
       int curIndex = 0;
       getPermutations(operatorBank,operatorCount,permutation,
                                   permutationLength,curIndex);
       return 0;
   }

输出:

   +++
   ++-
   ++*
   ++/
   +-+
   +--
   +-*
   +-/
   +*+
   +*-
   +**
   +*/
   +/+
   +/-
   +/*
   +//
   .
   .
  and so on.

答案 1 :(得分:1)

带有重复元素的字符串不是可能的排列,因为排列是一种排序。

你可以使用3个嵌套for循环来做到这一点,正如Wlyles所说。

编辑添加:

这将打印我认为你想要的字符串。您可以使用opPermutations.push_back(operatorBank[i]+operatorBank[j]+operatorBank[k])替换cout语句以添加到向量。

#include <iostream>
#include <string>

int main(){
  std::string operatorBank[4] = {"+","-","*","/"};

  for (int i=0; i<4; ++i){
    for (int j=0; j<4; ++j){
      for (int k=0; k<4; ++k){
        std::cout << operatorBank[i] << operatorBank[j] << operatorBank[k] << std::endl;
      }
    }
  }

  return 0;
}

我认为可能混淆了“排列”这个词。您可以获得与集合{"+","+","+","-","-","-","*","*","*","/","/","/"}的3个排列相同的字符串,但使用循环对我来说似乎更简单。

答案 2 :(得分:1)

生成排列的最简单方法是Set Product ..

list<string> setProduct (list<string> a, list<string> b)
{
    list<string> L;
    list<string>::iterator i, j;

    for(i = a.begin(); i != a.end(); ++i)
        for(j = b.begin(); j != b.end(); ++j)
            L.push_front(*i + *j);

    return L;
}

list<string> permute (list<string> a, int len)
{
     list<string> L;

     while (len --> 0) L.splice(a.end(), setProduct(L,a));

     return L;
}