2016-09-08 4 views
-2

それはいくつかの順列をプリントアウトしていますが、残りはヌルで、私は理由が分かりません。私はStringへのすべての順列を必要としますが、util.Arraysを除く他のパッケージはインポートできません。助けてください!文字列の順列を作成する私の再帰で何が問題になっていますか?

import java.util.Arrays; 

public class DIE 
{ 

    public static String[] printPermutations(String s) 
    { 
     int l = s.length(); 
     int f = factorial(l); 
     int count = 0; 
     String[] array = new String[f]; 
     permute("", s, array, 0); 
     Arrays.sort(array); 
     return array; 
    } 

    private static String[] permute(String x, String s, String [] array, int count) 
    { 
     int l = s.length(); 
     if (l == 0) 
     { 
      array[count] = (x + s); 
     } 
     for (int i = 0; i < l; i++) 
     { 
      permute(x + s.charAt(i), s.substring(0, i) + 
        s.substring(i +1, s.length()), array, count); 
      count++; 
     } 
     return array; 
    } 

    public static int factorial(int l) 
    { 
     if (l == 1) 
     { 
      return 1; 
     } 
     else 
     { 
      int result = l * factorial(l - 1); 
      return result; 
     } 
    } 

    /* 
    Do not edit anything below this comment. 
    */ 

    public static void main(String[] args) 
    { 
     String[] permutations = printPermutations(args[0]); 
     for(String p : permutations) 
     { 
      System.out.println(p); 
     } 
    } 
} 
+0

入力のどのような種類です(私見非常に悪いという名前のメソッドは、それがヘルパーメソッドと一緒に順列を作成し、何も出力しません)あなたは与える?私はこのコードが "Fable"、 "Cradle"などの入力に対して適切に動作しているとは思わないので、いくつかの例を投稿してください。 –

+0

私はabc abcdのような単純な文字列を試しています。 –

+0

メインプログラムでは、 forループは配列を出力します。 forループ全体を削除して使用します:System.out.println(順列); –

答えて

0

カウント変数が正しくありません。 permute("", "abc", ...)への最も外側のコール内では、次のレベルへのコールpermute("a", "bc", ...)が2つの順列を作成したにもかかわらず、1だけインクリメントされます。あなたの結果はList<String>を使用収集する代わりにString[]

  • は、2つの解決策があります。次に、順列の数を手動で数える必要はありません。

    private static int permute(String x, String s, String [] array, int count) 
    { 
        int l = s.length(); 
        if (l == 0) 
        { 
         array[count++] = x; 
        } 
        for (int i = 0; i < l; i++) 
        { 
         count = permute(x + s.charAt(i), s.substring(0, i) + 
           s.substring(i +1, s.length()), array, count); 
        } 
        return count; 
    } 
    
    :(1とにかく決して使用されていることを、代わりに結果の配列の)
  • letがこのようになります方法を数える新しいを返すためにpermuteについて

新たなカウントを返すpermute

List<String>を使用すると、さらに変更する必要がありますが、permuteの機能は小さくなります。

public static List<String> printPermutations(String s) 
{ 
    int l = s.length(); 
    int f = factorial(l); 
    List<String> result = new ArrayList<>(f); 
    permute("", s, result); 
    Collections.sort(result); 
    return result; 
} 

private static void permute(String x, String s, List<String> result) 
{ 
    int l = s.length(); 
    if (l == 0) 
    { 
     result.add(x); 
    } 
    for (int i = 0; i < l; i++) 
    { 
     permute(x + s.charAt(i), s.substring(0, i) + 
       s.substring(i +1, s.length()), result); 
    } 
} 

起因しprintPermutationsの変更結果の主な方法でいくつかの小さな変更:

+0

ごめんなさいあなたが何を意味するかをもっと説明してください。permutは、私が正式なパラメータにそれを含めることによって何をしようとしていたかを新しいカウントに戻します。 –

+0

あなたは素晴らしいです!どうもありがとうございます! –

関連する問題