2012-03-14 5 views
1

알파벳과 같은 문자열의 순열의 특정 조합을 가져오고 싶습니다. 나는, 내가 5 번째 요소를 필요로하는 경우 나, 목록에서 걸릴 수 있습니다, 잘순열의 특정 조합을 가져 오시겠습니까?

public class PermutationExample { 

public static List<String> getPermutation(String input) { 

    List<String> collection = null; 

    if (input.length() == 1) { 
     collection = new ArrayList<String>(); 
     collection.add(input); 
     return collection; 
    } else { 
     collection = getPermutation(input.substring(1)); 
     Character first = input.charAt(0); 
     List<String> result = new ArrayList<String>(); 
     for (String str : collection) { 
      for (int i = 0; i < str.length(); i++) { 
       String item = str.substring(0, i) + first 
         + str.substring(i); 
       result.add(item); 
      } 
      String item = str.concat(first.toString()); 
      result.add(item); 
     } 
     return result; 
    } 

} 

public static void main(String[] args) { 
    System.out.println(PermutationExample.getPermutation("ABCD")); 

} 
} 

이 코드는 작동하고 나는 모든 조합을 얻을 수 있습니다 : 나를 이해하기 위해, 나는 당신에게 내가 사용하는 코드를 보여 드리겠습니다 그것을받을 수 있습니다. 그러나 그 문자열이 알파벳이라면 ... 작동하지 않았고, 너무 큽니다. 내가해야 할 일은 모든 요소 중 1221 번째와 같은 특정 요소를 얻는 것입니다. 조합?

답변

1

전에 파이썬으로 만 비슷한 문제가 풀 렸습니다.

만약 당신이 필요로하는 것이 단순히 n 번째 순열이라면, 순열을 생성하는 것에 대해 생각한다면, 모든 순열을 생성하고 n 번째를 반환하는 것이 훨씬 더 잘할 수 있습니다.

당신은 원하는 순열의 수 앞에 어떤 요소가 있어야하는지, 그리고 요소의 나머지는 재귀 적으로 무엇인지 알아내어 "간단히"할 수 있습니다.

col [n] < col [n + 1] 과 같은 값에 대한 값 집합 [0, ..., X]을 가정하면 N! 가능한 순열, 컬렉션이 완전히 반전되는 경우.

각 (N-1) 이후에 컬렉션의 헤드가 변경된 것을 볼 수 있습니다! 순열, 그래서 n < (N-1)!, 머리가 머리입니다. 그런 다음 나머지 순열을 가지며 동일한 논리를 재귀 적으로 적용 할 수 있습니다.

이 정보가 도움이됩니까? 나는 그것이 상당히 높은 수준이라는 것을 알고 당신은 그것에 대해 조금 생각해야 할 것이지만, 아마도 그것은 당신을 올바른 길로 인도 할 것입니다.

+0

예, 문자열의 N 번째 순열이 필요하지만 문제를 해결하는 방법을 모르겠습니다. / – Aleksiev

관련 문제