2012-03-12 3 views
2

라고 가정 해 봅시다. alphabet = "abcd1234" 4 자리 숫자를 가진 모든 조합을 원할 것입니다. 모든 순열을 거치고 4 자 길이의 문자 만 선택하고 싶지는 않습니다. 알파벳이 클 수 있기 때문에.주어진 알파벳의 모든 4 자리 조합을 얻으십시오

편집 : 이것은 내가 지금까지

String alpha = "abcdefg"; 

     for (int i = 0 ; i < alpha.length() ; i++) { 
      for (int j = i ; j < alpha.length()-i ; j++) 
        System.out.println(String.valueOf(alpha.charAt(i)) + String.valueOf(alpha.charAt(j)) ); 
     } 

불행하게도 나는 단지 2 문자 단어를 얻을 수있을 것입니다. 그리고 같은 루프 구조를 사용하여 4 자의 단어를 인쇄 할 수는 없습니다.

+0

조합! = 순열 – simchona

+1

당신의 노동의 열매를 표시하지 않음으로써, 당신은 당신이 너 자신을하거나 충분히 똑똑하지 너무 게으른 것을 의미한다. 자신이 한 일을 보여줌으로써 이러한 가정을 잘못 입증하십시오. –

+0

"N 선택 K"문제는 여러 웹 사이트에서 충분히 논의되었습니다. 원하는 것이 무엇입니까? Andrzej가 묻는 것처럼 ... 지금 어떤 문제에 직면하고 있습니까? – pcalcao

답변

4

문제가 올바르게 - 모든 조합 aaaa부터 4444까지 - 그러면 작동합니다. "확장 가능"- 문자 당 중첩 루프가 필요 없습니다.

String alpha = "abcd1234"; 
char[] seq = alpha.toCharArray(); 

int length = 4; 
StringBuilder builder = new StringBuilder(" "); 

int[] pos = new int[length]; 
int total = (int) Math.pow(alpha.length(), length); 
for (int i = 0; i < total; i++) { 
    for (int x = 0; x < length; x++) { 
     if (pos[x] == seq.length) { 
      pos[x] = 0; 
      if (x + 1 < length) { 
       pos[x + 1]++; 
      } 
     } 
     builder.setCharAt(x, seq[pos[x]]); 
    } 
    pos[0]++; 

    System.out.println(builder.toString()); 
} 
1

가장 단순한 - 자릿수가 작고 고정 된 경우 - 간단한 열거 형입니다. 알파벳 멤버를 반복하면됩니다.

알파벳에서 나는이 문자열의 모든 문자가 고유하다고 가정하지만 솔루션에서 여러 번 발생할 수 있습니다. 그렇지 않으면 순열을 수락하기 전에 i1 != i2 등을 수행해야한다는 추가 확인이 필요합니다.

int alphaLen = alphabet.length(); 
for (int i1 = 0; i1 < alphaLen; ++i1) { 
    for (int i2 = 0; i2 < alphaLen; ++i2) { 
     for (int i3 = 0; i3 < alphaLen; ++i3) { 
      for (int i4 = 0; i4 < alphaLen; ++i4) { 
       foo(alphabet.charAt(i1) + alphabet.charAt(i2) + alphabet.charAt(i3) + alphabet.charAt(i4)); 
      } 
     } 
    } 
} 
관련 문제