2017-06-20 1 views
-1

文字列を指定すると、左から右へ文字をピックするすべての組み合わせを出力したいと思います。入力:ABCD 出力: ABC ACD ABD BCD 交流 広告 BC BD CD左から右への文字列の組み合わせ(順列ではない)C++

私はそれを行うことができますが、私は元のために、それを一般化することはできません。文字列abcdの中で、私は1つの文字だけを削除して上記の組み合わせをすべて得ることができます。それから、2文字を削除するなどしてやることもできます。 コード:私は最初の1との組み合わせを印刷することができるように

for(int i = 1; i < name.size(); i++){ 

     for(int j = 0; j < name.size(); j++){ // PRINT ARRAY 
      if(j != i) cout << name[j]; 
     } 
     cout << endl; 

    } 

どのように私はそれを一般化することができます:2文字1つの文字を削除

for(int i = 1; i < name.size(); i++){ 

    for(int k = 2; k < name.size(); k++){ 

     for(int j = 0; j < name.size(); j++){ // PRINT ARRAY 
      if(j != i && j != k) cout << name[j]; 
     } 
     cout << endl; 

     } 

    } 

//を削除

name = "abcdefghi"; 

//文字が欠落していて2文字が欠落していて、3など... このようにして、1〜nの文字が欠けているすべての組み合わせを取得する場合、私は

+0

だからあなたはあまりにもすべての文字との組み合わせをしたくないですか? -1文字から始めたいですか? – koleygr

+0

あなたの質問の簡単な答えは、あなたのループを別のループに入れて文字を取り除くことです。最初に文字を取り除くか、ゼロ文字を取り除くことで始めることができます – koleygr

+1

[C++のn個のアイテムのk個の組み合わせをすべて作成する] htt38://stackoverflow.com/questions/12991758/creating-all-possible-k-combinations-of-n-items-in-c) – ljeabmreosn

答えて

0

あなたは、たとえば、このようにそれを行うことができます... forループのn個の数が必要になります:あなたはカウンターを使用し、フラグとして使用することができ、

print_combinations(const string& name) { 
    if(name.size() > 1) { 
     for(int i = 0; i < name.size(); ++i) { 
      string name2 = name; 
      name2.erase(i, 1); 
      cout << name2; 
     } 
     for(int i = 0; i < name.size(); ++i) { 
      string name2 = name; 
      name2.erase(i, 1); 
      print_combinations(name2); 
     } 
    } 
} 
0

を現在、何かのように:

void print_combinations(const std::string& s) 
{ 
    if (s.size() >= 32) { 
     return; // String too long 
    } 
    std::uint32_t end = 1u << s.size(); 
    for (std::uint32_t i = 0; i != end; ++i) 
    { 
     auto j = i; 
     for (const auto c : s) 
     { 
      if ((j & 1) != 0) { 
       std::cout << c; 
      } 
      j >>= 1; 
     } 
     std::cout << std::endl; 
    } 
} 

Demo

関連する問題