//java 全排列
private static void Main(){
Set<String > set = new HashSet<>(); //用于存储,去重
Scanner sc = new Scanner(System.in);
String s = sc.nextLine;
Full(set,0,s.length()-1,s.toCharArray());
System.out.pringln(set);
}
//全排列的核心代码块
private static void Full(Set<String > set, int from, int to, char[] chars){
if(from == to)
set.add(new Set(chars));
for(int i = from; i <= to; i++){
swap(chars, from, i);
Full(set, from + 1, to, chars);
swap(chars, from, i);
}
}
//交换代码块
private static void swap(char[] chars, int from, int i){
char swap = chars[from];
chars[from] = chars[i];
chars[i] = temp;
}
//测试
public static void main(String []args){
Main();
}
---------------------------------------------------------------------------------------------------------------------------------
//组合
/**
*这里的例子是从自然数1,2,…,n,从中任取r个数,输出所有组合。
*输入格式:
*一行两个自然数n、r(1<n<21,1≤r≤n)。
*输出样例 复制
* 1 2 3
* 1 2 4
* 1 2 5
* 1 3 4
* 1 3 5
* 1 4 5
* 2 3 4
* 2 3 5
* 2 4 5
* 3 4 5
*/
private static void Main(){
Scannner scanner = new Scanner(System.in);
int n = scanner.nextInt;
int k = scanner.nextInt;
List<ArrayList<Integer>> arr = new ArrayList<>();
combine(arr, new ArrayList<Integer>, n, k, 1);
for(List<Integer> list:arr){
System.out.println(list);
}
}
//核心代码
private static void combine(List<List<Integer>> arr, List<Integer> temp,int n, int k, int start){
if(k == 0){
arr.add(new ArrayList<>(temp));
return;
}
for(int i = start; i <= n; i++){
temp.add(i);
combine(arr, temp, n, k - 1, i + 1);
temp.remove(temp.size() - 1);
}
}
//主方法
private static void Main(String[] args){
Main();
}
累死我了,记事本写的,可能有写错的单词,太感谢Idea了