문자열의 모든 순열을 생성하는 문제에 대한 해결책을 읽었습니다 (solution).중복이없는 문자열의 순열
perm2와 perm1이 어떻게 다른지 설명 할 수 있습니까? 일부 문자는 문자열의 같은 경우
// print N! permutation of the characters of the string s (in order)
public static void perm1(String s) { perm1("", s); }
private static void perm1(String prefix, String s) {
int N = s.length();
if (N == 0) System.out.println(prefix);
else {
for (int i = 0; i < N; i++)
perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
}
}
// print N! permutation of the elements of array a (not in order)
public static void perm2(String s) {
int N = s.length();
char[] a = new char[N];
for (int i = 0; i < N; i++)
a[i] = s.charAt(i);
perm2(a, N);
}
private static void perm2(char[] a, int n) {
if (n == 1) {
System.out.println(a);
return;
}
for (int i = 0; i < n; i++) {
swap(a, i, n-1);
perm2(a, n-1);
swap(a, i, n-1);
}
}
또한, 다음 몇 가지 순열이 될 것입니다 (나는 유일한 차이점은 마지막에 perm2는 동안 첫 번째 위치에 각 요소를 넣어 시도 perm1 그 느낌) 같은? 이 문제를 방지하기 위해 생각할 수있는 유일한 방법은 순열의 인스턴스를 하나만 유지하도록 결과를 해시 셋에 저장하는 것입니다. 더 나은 해결책이 있습니까?
http://www.careercup.com/question? id = 9647964 – giulio
@giulio 예 대안을 추가했습니다. 그것이 링크와 같은지 확실하지 않으면 확인합니다. – sprinter
모든 문자열에 대해 작동하지 않습니다. 예를 들어 aaaa 또는 aaba를 시도하십시오 (왜 작동하지 않는지 생각하려고합니다). – giulio