2017-09-05 4 views
1

の順列の総数は見つける:私は、次のプログラムで与えられた文字列の順列の総数を計算しようとしている文字列

プログラム

class Test{ 

    public static void main(String[] args){ 
     String str = "ABC"; 
     int n = str.length(); 

     //System.out.println(permute(str, 0, n-1)); 
     permute(str, 0, n-1); 
    } 

    private static int permute(String str, int l, int r){ 
     ArrayList<String> list=new ArrayList<String>(); 
     if (l == r) 
      //System.out.println(str); 
      list.add(str); 
     else 
     { 
      for (int i = l; i <= r; i++) 
      { 
       str = swap(str,l,i); 
       permute(str, l+1, r); 
       str = swap(str,l,i); 
      } 
     } 
     /*for (int i=0;i<list.size() ;i++) { 
      System.out.println(list.get(i)); 
     }*/ 
     return list.size(); 
    } 
public static String swap(String a, int i, int j){ 
     char temp; 
     char[] charArray = a.toCharArray(); 
     temp = charArray[i] ; 
     charArray[i] = charArray[j]; 
     charArray[j] = temp; 
     return String.valueOf(charArray); 
    } 
} 

を出力:0

この場合も、指定された文字列の並べ替えを表示するのと同じ方法を適用します。次のプログラムは、私のアプローチを示しています

プログラム

class Test{ 

    public static void main(String[] args){ 
     String str = "ABC"; 
     int n = str.length(); 

     //System.out.println(permute(str, 0, n-1)); 
     permute(str, 0, n-1); 
    } 

    private static void permute(String str, int l, int r){ 
     ArrayList<String> list=new ArrayList<String>(); 
     if (l == r) 
      //System.out.println(str); 
      list.add(str); 
     else 
     { 
      for (int i = l; i <= r; i++) 
      { 
       str = swap(str,l,i); 
       permute(str, l+1, r); 
       str = swap(str,l,i); 
      } 
     } 
     for (int i=0;i<list.size() ;i++) { 
      System.out.println(list.get(i)); 
     } 
     //return list.size(); 
    } 
public static String swap(String a, int i, int j){ 
     char temp; 
     char[] charArray = a.toCharArray(); 
     temp = charArray[i] ; 
     charArray[i] = charArray[j]; 
     charArray[j] = temp; 
     return String.valueOf(charArray); 
    } 
} 

出力

ABC 
ACB 
BAC 
BCA 
CBA 
CAB 

私は0を得るarraylistのサイズを返すようにしようとすると、私の疑問は、ここにあります私の出力として、私はlistのすべての要素を印刷するとき、それはすべての順列を示しています。

誰かが疑いを晴らすことができますか?

+4

これは、permuteメソッドで新しいListオブジェクトを作成するためです。リストをグローバル変数にする。 –

+2

番号を取得するためにすべての順列を生成する必要はないことをご存知ですか? – MBo

+0

助けてくれてありがとう! –

答えて

2

メソッド内にリストを作成するのは間違いです。再帰のために、最後に空のリストが得られます。 あなたの方法であなたのArrayListを渡すために今できる最も速い修正。

private static int permute(String str, int l, int r, ArrayList<String> list){ 

    if (l == r) { 
     list.add(str); 
    } 
    else { 
     for (int i = l; i <= r; i++) { 
      str = swap(str,l,i); 
      permute(str, l+1, r, list); 
      str = swap(str,l,i); 
     } 
    } 
    return list.size(); 
} 

とこのようにそれを呼び出す:今、あなたの出力は6あるべき

String str = "ABC"; 
    int n = str.length(); 
    ArrayList<String> list = new ArrayList<>(); 
    permute(str, 0, n-1, list); 

    System.out.println(list.size()); 

EDIT

あなたはそれがnはあなたの文字列の長さであるn!、だもちろんの順列の数を、必要な場合。文字列中のcharsが繰り返されている場合、別の式n!/ (k1!*k2!*k3!...)でそれを行う、

int i = numberOfPermutations("abc".length()); 

System.out.println(i); 

UPDATE提案として

private static long numberOfPermutations(long n) { 
    if(n == 1 || n == 0) return 1; 

    return (n) * numberOfPermutations(n-1); 
} 

は、このようにそれを使用してください。 Implimentation:

String string = "ABBCCCD"; 
String[] split = string.split(""); 

Map<String, Long> collect = Arrays.stream(split).collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 


long result = numberOfPermutations(string.length())/collect.values().stream().map(Main::numberOfPermutations).reduce(1L, (a, b) -> a *b); 
System.out.println(result); 
+2

すべての異なる文字に対して順列の数は 'n!'です。それらのいくつかが繰り返している場合、数式は 'n!/(k1!* k2!* k3!...)'です。ここでk [i]はすべての文字種の量です。たとえば、 'ABBCCCD'の結果は' 7! /(2!* 3!) ' – MBo

+0

@MBo、そうです、それは尋ねたはずです。私の場合、通常の場合、置換問題には異なる文字が含まれます。私は答えを編集します、ありがとう –

関連する問題