文字列を入力し、文字列内の文字のすべての順列を出力します。
この文字列配列は任意の順序で返すことができますが、要素が重複することはありません。
典型的な完全順列問題では、文字列順列の特性に従って、すべての順列について深さ優先探索を検討します。すなわち、文字交換により、まず最初の文字を固定し(n ケース)、次に 2 文字目を固定し(n-1 ケース)、…、最後に n 番目の文字を固定する(1 ケース)。 リーキ
文字列に繰り返し文字がある場合は、順列方式にも繰り返し順列方式があります。繰り返し方式を排除するには、特定の文字を固定するときに、「各文字がこの位置に 1 回だけ固定される」ようにする必要があります。DFS の観点から、この操作は「プルーニング」と呼ばれます。
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigInteger;
import java.util.stream.Stream;
class Main {
public static List<String> res = new LinkedList<>();
public static char[] c;
public static void main(String[] args) {
// 处理输入
Scanner in = new Scanner(System.in);
String input_str = in.nextLine();
System.out.println(Arrays.toString(permutation(input_str)));
}
public static String[] permutation(String s) {
c = s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
public static void dfs(int x) {
if(x == c.length - 1) {
res.add(String.valueOf(c)); // 添加排列方案
return;
}
HashSet<Character> set = new HashSet<>();
for(int i = x; i < c.length; i++) {
if(set.contains(c[i])) continue; // 重复,因此剪枝
set.add(c[i]);
swap(i, x); // 交换,将 c[i] 固定在第 x 位
dfs(x + 1); // 开启固定第 x + 1 位字符
swap(i, x); // 恢复交换
}
}
public static void swap(int a, int b) {
char tmp = c[a];
c[a] = c[b];
c[b] = tmp;
}
}
Huawei OD 2023/2022 最新試験問題と解説、合格率100%。
Java: https://renjie.blog.csdn.net/article/details/127947829
パイソン: https://renjie.blog.csdn.net/article/details/127946125
C++: https://renjie.blog.csdn.net/article/details/126965954
JS: https://renjie.blog.csdn.net/article/details/128974467
C: https://renjie.blog.csdn.net/article/details/129190260
Huawei OD 2023/2022 最新試験問題と解説、合格率100%。
Java: https://renjie.blog.csdn.net/article/details/127947829
パイソン: https://renjie.blog.csdn.net/article/details/127946125
C++: https://renjie.blog.csdn.net/article/details/126965954
JS: https://renjie.blog.csdn.net/article/details/128974467
C: https://renjie.blog.csdn.net/article/details/129190260
Huawei OD 2023/2022 最新試験問題と解説、合格率100%。
Java: https://renjie.blog.csdn.net/article/details/127947829
パイソン: https://renjie.blog.csdn.net/article/details/127946125
C++: https://renjie.blog.csdn.net/article/details/126965954
JS: https://renjie.blog.csdn.net/article/details/128974467