Java 프로그램의 중복 순열

Sumeet

문자열의 순열을 재귀 적으로 생성하는 알고리즘을 읽었습니다.

invoke the function with j = 1
    if (j == length of string)
        print the string and return
    else
        for (i = j to length of string)
            interchange jth character with ith character
            call function on j + 1

다음과 같이 Java를 사용하여 구현했습니다.

class PERMUTATION {
    private int count = 1;
    private char[] arr = {'A', 'B', 'C'};

    public void perm(int k) {
        if (k == 3)  {
            System.out.print(count+++".");
            for (int i = 0; i < 3; ++i)
                System.out.print(arr[i]+"  ");
            System.out.println();
            return;
        }
        for (int i = k; i <= 3; ++i) {
            /*interchanging ith character with kth character*/
            char c = arr[i - 1];
            arr[i - 1] = arr[k - 1];
            arr[k - 1] = c;
            perm(k + 1);
        }
    }

    public static void main(String []args) {
        System.out.println("the permutations are");
        PERMUTATION obh=new PERMUTATION();
        obh.perm(1);
    }
}

하지만 내 프로그램은 중복 순열을 생성합니다. 왜?

이 알고리즘은 "원본"배열이 변경되지 않은 경우 작동하므로 각 인덱스가 올바르게 처리됩니다.

코드의 출력을 살펴 보겠습니다.

1.ABC
2.ACB
3.CAB
4.CBA
5.ABC
6.ACB

보시다시피, 반복에서. 3, B 를 첫 번째 인덱스 로 이동해야하는 경우 대신 C 를 이동 해야합니다. B이미 다른 위치 로 이동했기 때문 입니다. 이 사실로 인해 B 는 첫 번째 지수를 올릴 기회가 없으며 2와 3 사이에서만 "반동"할 것입니다.

주요 문제는 "소스"배열을 변경한다는 것입니다. 이를 피하면 알고리즘이 올바르게 작동합니다.

class PERMUTATION {
    private int count = 1;

    public void perm(char[] arr, int k) {
        if (k == 3) {
            System.out.print(count++ + ".");
            for (int i = 0; i < 3; ++i)
                System.out.print(arr[i] + "  ");
            System.out.println();
            return;
        }
        char[] arr2 = arr.clone(); // clone the passed array, so we don't mess it up
        for (int i = k; i <= 3; ++i) {
            /* interchanging ith character with kth character */
            char c = arr2[k - 1];
            arr2[k - 1] = arr2[i - 1];
            arr2[i - 1] = c;
            perm(arr2, k + 1);
        }
    }

    public static void main(String[] args) {
        System.out.println("the permutations are");
        PERMUTATION obh = new PERMUTATION();
        obh.perm(new char[] {'A', 'B', 'C'}, 1); // pass the original array
    }
}

출력은 다음과 같습니다.

1.ABC
2.ACB
3.BAC
4.BCA
5.CAB
6.CBA

BTW : 마음하시기 바랍니다 자바 명명 규칙을 그래서 당신의 클래스를 호출하지 않는, PERMUTATION사용 Permutation대신.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

두 문자열이 서로의 순열인지 결정하는 프로그램의 시간 복잡성

분류에서Dev

Java의 새 배열에 중복 배열

분류에서Dev

트리 복구 프로그램의 순환 런타임

분류에서Dev

자바 단순 복권 프로그램

분류에서Dev

자바 단순 복권 프로그램

분류에서Dev

Java 프로그램에서 ProcessBuilder의 다중 실행

분류에서Dev

Flutter 앱이 다른 응용 프로그램에서 열립니다 (중복 응용 프로그램)

분류에서Dev

다중 스레드 응용 프로그램의 로그 대기열

분류에서Dev

중복이없는 문자열의 순열

분류에서Dev

R 프로그래밍-반복 및 순서에 대한 순열

분류에서Dev

Java의 MapReduce 프로그램

분류에서Dev

md5sum 출력을 C 프로그램의 문자열로 복사

분류에서Dev

프로젝트에 대한 배열 단순 코딩을 사용하는 Java 프로그램

분류에서Dev

프로그램의 시간 복잡성을 줄이십니까 (Java에서)?

분류에서Dev

csv 파일을 다른 열 순서로 병합 중복 제거

분류에서Dev

열별로 중복을 제거하는 방법 (역순)

분류에서Dev

실행중인 프로그램의 출력을 얻기위한 Java 코드

분류에서Dev

실제로 Java 응용 프로그램 창을 열지 않고 실행중인 Netbeans 표시

분류에서Dev

"배열에서 중복 제거"프로그램의 시간 복잡성을 어떻게 개선 할 수 있습니까?

분류에서Dev

Java의 배열에서 중복 문자열 제거

분류에서Dev

JAVA 개체 배열 프로그램의 잘못된 출력 (초보자)

분류에서Dev

순서대로 발생하는 문자열 조각의 중복 요소 감지

분류에서Dev

Java의 클래스 배열에서 중복 무시

분류에서Dev

중복 LibreOffice 프로그램 삭제

분류에서Dev

목록을 사용하여 Java에서 중복 요소를 제거하는 간단한 프로그램

분류에서Dev

Java 콘솔의 중복 프롬프트

분류에서Dev

Lubuntu의 프로그램 우선 순위

분류에서Dev

Java에서 중복 문자열 배열

분류에서Dev

아나그램 검색 중 문자열의 순열에 대한 시간 복잡성을 처리하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    두 문자열이 서로의 순열인지 결정하는 프로그램의 시간 복잡성

  2. 2

    Java의 새 배열에 중복 배열

  3. 3

    트리 복구 프로그램의 순환 런타임

  4. 4

    자바 단순 복권 프로그램

  5. 5

    자바 단순 복권 프로그램

  6. 6

    Java 프로그램에서 ProcessBuilder의 다중 실행

  7. 7

    Flutter 앱이 다른 응용 프로그램에서 열립니다 (중복 응용 프로그램)

  8. 8

    다중 스레드 응용 프로그램의 로그 대기열

  9. 9

    중복이없는 문자열의 순열

  10. 10

    R 프로그래밍-반복 및 순서에 대한 순열

  11. 11

    Java의 MapReduce 프로그램

  12. 12

    md5sum 출력을 C 프로그램의 문자열로 복사

  13. 13

    프로젝트에 대한 배열 단순 코딩을 사용하는 Java 프로그램

  14. 14

    프로그램의 시간 복잡성을 줄이십니까 (Java에서)?

  15. 15

    csv 파일을 다른 열 순서로 병합 중복 제거

  16. 16

    열별로 중복을 제거하는 방법 (역순)

  17. 17

    실행중인 프로그램의 출력을 얻기위한 Java 코드

  18. 18

    실제로 Java 응용 프로그램 창을 열지 않고 실행중인 Netbeans 표시

  19. 19

    "배열에서 중복 제거"프로그램의 시간 복잡성을 어떻게 개선 할 수 있습니까?

  20. 20

    Java의 배열에서 중복 문자열 제거

  21. 21

    JAVA 개체 배열 프로그램의 잘못된 출력 (초보자)

  22. 22

    순서대로 발생하는 문자열 조각의 중복 요소 감지

  23. 23

    Java의 클래스 배열에서 중복 무시

  24. 24

    중복 LibreOffice 프로그램 삭제

  25. 25

    목록을 사용하여 Java에서 중복 요소를 제거하는 간단한 프로그램

  26. 26

    Java 콘솔의 중복 프롬프트

  27. 27

    Lubuntu의 프로그램 우선 순위

  28. 28

    Java에서 중복 문자열 배열

  29. 29

    아나그램 검색 중 문자열의 순열에 대한 시간 복잡성을 처리하는 방법은 무엇입니까?

뜨겁다태그

보관