2017-02-01 3 views
0
public static void perm(String str) { 
    perm1(str,""); 
} 

private static void perm1(String str, String prefix) { 
    int n = str.length(); 

    if (n == 0) StdOut.println(prefix); 
    else { 
     for (int i = 0; i < n; i++){ 
      String rem = str.substring(0,i) + str.substring(i+1); 
      perm1(rem, prefix + str.charAt(i)); 
     } 
    } 
} 

예를 들어 우리의 사례가 "abc"인 경우 코드에서이 문자열의 길이가 감소하여 결국 기본 사례에 도달하게됩니까? 나는 그것이 항상 "abc"인 것처럼 우리가 rem을 내버려두고있는 것을 안다. .. 내가 무엇을 놓치고 있냐?자바 - 아무도 나를 위해이 순열 코드를 설명 할 수 있습니까?

+0

'perm'은'rem'을 첫 번째 인수로 사용하여 재귀 호출됩니다. 여기서'rem'은'str'보다 1 문자 짧습니다. – Thomas

+0

머리카락을 파마에 넣습니다. 최소한 그것이 인터페이스가 제안하는 것입니다. – byxor

답변

0

요점은 substring (int beginIndex, int endIndex) 메소드는 endIndex에 대해 만을 사용한다는 것입니다. 예를 들어, i = 1이면 다음과 같이 나타납니다.

String str = "abc"; 
String s1 = str.substring(0, 1); // a 
String s2 = str.substring(1 + 1); // c 
String rem = s1 + s2; // ac