全排列递归算法
思路大致如下
从图片的思路来看,第一层是先拿出一个值,然后递归剩下的。最后再把结果排列起来。
比如给一个数组[1,2,3]输出改数组的所有排列可能
public static void test(int[]nums,int k){
if(k==nums.length-1) System.out.println(Arrays.toString(nums));
else {
for (int i = k; i < nums.length ;i++) {
swap(nums,k,i);
test(nums,k+1);
swap(nums,i,k);
}
}
}
public static void swap(int[]c,int i,int j){
int temp=c[i];
c[i]=c[j];
c[j]=temp;
}
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
输入一个字符串,按字典序打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串
abc,acb,bac,bca,cab和cba。
这个题的关键就是全排列,然后排序。
public ArrayList<String> Permutation(String str){
HashSet<String>set=new HashSet<>();
ArrayList<String>list=new ArrayList<>();
if(str.equals("")||str==null)return list;
PermutationHelper(str.toCharArray(),0,set);
list.addAll(set);
Collections.sort(list);
return list;
}
private void PermutationHelper(char[] chars,int i,HashSet<String>set){
if(i==chars.length)set.add(String.valueOf(chars));
else {
for (int j = i; j < chars.length; j++) {
swap(chars,i,j);
PermutationHelper(chars,i+1,set);
swap(chars,i,j);
}
}
}
private void swap(char[] cs,int i,int j){
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}