2012-03-06 3 views
1

文字列のすべての組み合わせを生成しようとしています。最初のパラメータは指定された文字列、2番目のパラメータは文字の数です。だから、combinations("ab",2)は私にaa, ab, ba, bbを与えるべきとcombinations("abc",2)は私の現在のコードは私にaa, ab, bbを与える最初のケースでは、私にaa, ab, ac, ba, bb, bc, ca, cb, ccなど文字列内での文字の組み合わせの生成が完全に機能しないのはなぜですか?

を与えるべきである(それはbaをスキップ)。 これは私のコードです

 public static void combinations(String s, int n) 
     { 
      combinations(s,"",n); 
     } 


     public static void combinations(String s, String prfx, int n) 
     { 
      if(n == 0) 
      { 
       System.out.println(prfx); 
      } 

      else 
      { 
       for(int i = 0; i < s.length(); i++) 
       { 
        combinations(s.substring(i), prfx + s.charAt(i), n-1); 

       } 
      } 
     } 

私は間違っていますか?あなたが正しい答えを与えてくれるだけでなく、私が再帰をあまりよくしていないので、私はそれから学ぶことができるので、私にいくつかの説明を与えていただければ幸いです。ありがとう。

答えて

1

あなたの問題の根はここにある:

combinations(s.substring(i), prfx + s.charAt(i), n-1); 
       ^^^^^^^^^^^^^^ 

あなたは残りの組み合わせを構築するために再帰呼び出しを行い、その後、文字列内の文字をループにしたいと接頭辞として順番に各文字を使用します文字列のただし、元の文字列の部分文字列のみを再帰呼び出しに渡すと、すべての置換が生成されることはありません。ループが文字列 "ab"(ループカウンタiが1のとき)の2番目の文字に到達すると、この再帰呼び出しはcombinations("b", "" + "b", 1)になるため、上記の場合、観察したように、 "ba"をスキップします。これは "ba"ではなく "bb"のみを生成することができます。代わりにcombinations("ab", "" + "b", 1)だった場合は、期待される組み合わせ "ba"と "bb"の両方が得られます。

ですから、各再帰呼び出しに文字列全体を渡す必要があります:

combinations(s, prfx + s.charAt(i), n-1); 
2

これは動作します:

public static void combinations(String s, int n) { 
    combinations(s, "", n); 
} 

public static void combinations(String s, String prfx, int n) { 
    if (n == 0) { 
     System.out.println(prfx); 
    } 

    else { 
     for (int i = 0; i < s.length(); i++) { 
      combinations(s, prfx + s.charAt(i), n - 1); 
     } 
    } 
} 
+0

+1それは私をたくさん助けたとして.... –

関連する問題