2012-08-30 5 views
6

저는 Java의 데이터 구조 및 알고리즘 책에서 몇 가지 문제를 해결하기 위해 10 학년 고등학생입니다.Java의 문자열 순열 (비회원)

질문 중 하나는 문자열의 모든 순열을 인쇄하는 것입니다.

class C14 
{ 
public static void main(char a[]) 
{ 
    // char[] a = {'c','a','r','b','o','n'}; 
    int c=0,w=0; 
    for(int q = 0;q<a.length;q++) 
    { 
     for(int i=0;i<a.length;i++) 
     { 
      for(int j=1;j<a.length;j++) 
      { 
       for(int k=1;k<a.length-1;k++) 
       { 
        for(int z=0;z<a.length;z++) 
        { 
         System.out.print(a[z]); 
         c++; 
        } 
        w++; 
        System.out.println(); 
        char p=a[k+1]; 
        a[k+1]=a[k]; 
        a[k]=p; 
       } 
       System.out.println(); 
      } 
      System.out.println(); 
      char x=a[0]; 
      a[0]=a[1]; 
      a[1]=x; 
     } 
     } 
    System.out.println(" Character count = " + c); 
    System.out.println(" Word count = " + w); 
    } 
} 

이것은 내 시도입니다. 책은 'c', 'a', 'r', 'b', 'o', 'n'등의 문자를 사용하도록 요구합니다. 내 솔루션은 그렇게하지만 3 ~ 4 자의 단어를 사용하려고하면 반복됩니다. 가장 바깥 쪽 루프를 제거하고 인쇄하려고하면 3 ~ 4 자 단어로 작동하지만 5+ 단어로는 작동하지 않습니다.

나는 그것에 대한 나의 추론을 명확히하기 때문에 기쁘다. 나는 그것이 가장 효율적이지는 않다는 것을 알고 있지만, 나는 단지 10 학년이라는 사실을 명심해야한다. 그리고 이것이 내 마음에 먼저 온 것이다.

누군가 나를 도울 수 있습니까? 아니면 적어도 잘못된 것이 있습니까? 반복적으로 먼저 반복적으로 작업하기 때문에 재귀 솔루션을 권하지 마십시오. 감사합니다. Sum35. 당신이 반복

N 것들로

+0

이 부분에 대해 - http://stackoverflow.com/questions/11915026/permutations-of-a-string-using-iteration? –

+0

응답 해 주셔서 감사합니다. 고맙습니다. 하지만 문제는 StringBuilder 및 하위 문자열 함수 등을 사용할 수 있다고 생각하지 않습니다. (허용되지 않음) –

+1

'a'크기가 변경 될 때마다 루프를 변경하지 않고 배열 'a'에서 순열을 수행하고 싶습니까? – John

답변

3

순열은 할 때마다 n 개의 선택 사항이 있습니다 ... 선택할! 그 중 R을 선택할 때

는 순열은 다음과 같습니다

N × N × (R 시간) = N^R

I 2 사례를 제시하고있다. 첫 번째 경우는 n과 r의 크기를 이미 알고 있고, 쉬운 경우입니다. 두 번째는 n과 r이 동적 인 경우입니다.

//when n and r are known statically 

class Permutation 
{ 
    public static void main(String[] args) 
    { 
     char[] values = {'a', 'b', 'c', 'd'}; 
     int n = values.length; 
     int r = 2; 

     int i = 0, j = 0; 
     for(i=0; i<n; i++) 
     { 
      for(j=0; j<n; j++) 
      { 
       System.out.println(values[j] + " " + values[i]); 
      } 
     } 
    } 
} 


//when n and r are known only dynamically 

class Permutation 
{ 
    public static void main(String[] args) 
    { 
     char[] values = {'a', 'b', 'c', 'd'}; 
     int n = values.length; 
     int r = 2; 
     int i[] = new int[r]; 
     int rc = 0; 
     for(int j=0; j<Math.pow(n,r); j++) 
     { 

      rc=0; 
      while(rc<r) 
      { 
       System.out.print(values[i[rc]] + " "); 
       rc++; 
      } 
      System.out.println(); 
      rc = 0; 
      while(rc<r) 
      { 
       if(i[rc]<n-1) 
       { 
        i[rc]++; 
        break; 
       } 
       else 
       { 
        i[rc]=0; 
       } 
       rc++; 
      } 
     } 
    } 
}