2017-09-05 1 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(); 
} 

과 전화 :

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

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

이제 출력 6해야한다.

편집

그냥 순열의 수, 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 네 말이 맞을 것입니다. 나를 위해, 일반적인 경우에 순열 문제는 다른 문자를 포함합니다. 답변을 수정 해 드리겠습니다. 감사합니다. –