回溯法之字符串全排列

121 阅读1分钟
import java.util.ArrayList;
import java.util.Arrays;

public class 全排列 {

    public static void main(String[] args) {
        ArrayList<String> res = getPermutation("123");
        System.out.println(res.size());
        System.out.println(res);
    }

    static ArrayList<String> res = new ArrayList<>();

    public static ArrayList<String> getPermutation(String A) {
        char[] arr = A.toCharArray();
        Arrays.sort(arr);// abc
        getPermutationCore(arr, 0);
        return res;
    }

    private static void getPermutationCore(char[] arr, int k) {
        if (k == arr.length) {// 排好了一种情况,递归的支路走到底了
            res.add(new String(arr));
        }

        // 从k位开始的每个字符,都尝试放在新排列的k这个位置
        for (int i = k; i < arr.length; i++) {
            swap(arr, k, i);// 把后面每个字符换到k位
            getPermutationCore(arr, k + 1);
            swap(arr, k, i);// 回溯
        }
    }

    // 交换位置
    static void swap(char[] arr, int i, int j) {
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}