大致思路:
将一个大的全排列分成小的排列,直到元素为1个时,就结束排列
就是比如字符串:“ABC”每个元素当一次老大,最为一个大的排列
第一次A与自己交换A当老大
第二次A与B进行交换B当老大
第三次A与C进行交换C当老大
从图中可以看出当我们交换一次之后,下一轮交换是从最初始的顺序进行交换,所以每次交换后就需要将我们的字符串进行一下还原
当第一轮每个都当一次老大后,就是每个老大剩下的元素再向下进行交换当老大,看图
最后的话,只剩一个就不能再往下划分排列,所以结束排列,得到排列结果
代码采用递归的形势所写,如下
package com.sj.分治回溯;
import java.util.HashSet;
//全排列
public class FullPermutation {
public static void main(String[] args) {
String s="ABC";
HashSet<String> set=new HashSet<>();
permutation(set,0,s.length()-1,s.toCharArray());//toCharArray(),就是将字符串转为字符数组
System.out.println(set);
}
private static void permutation(HashSet<String> set, int from, int to, char[] arr) {
//解决在数组arr中from到to之间的元素轮流当当前的老大 确定一个排列之后加入到set中
if(from==to) {
set.add(new String(arr));
}else {
for(int i=from;i<=to;i++) {
swap(arr,i,from);
//分治的第二次排列
permutation(set,from+1,to,arr);
//对字符串进行还原操作,以便后续排列
swap(arr,i,from);
}
}
}
private static void swap(char[] arr, int i, int from) {
char temp=arr[i];
arr[i]=arr[from];
arr[from]=temp;
}
}