全排列

题目

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

思想

全排列
笔试面试算法经典--全排列算法-递归&字典序实现(Java)

代码

public class Permutation {
    ArrayList res = new ArrayList<>();

    public ArrayList Permutation(String str) {
        if (str.length() == 0) {
            return new ArrayList<>();
        }
        permutationProcess(str.toCharArray(), 0, str.length() - 1);
        Collections.sort(res);
        return res;
    }

    /**
     * 全排列
     * @param chars
     * @param start
     * @param end
     */
    private void permutationProcess(char[] chars, int start, int end) {
        //递归边界条件:只剩下最后一个元素
        if (start == end) {
            res.add(String.valueOf(chars));
            return;
        }
        for (int i = start; i <= end; i++) { //固定第一个(start)位置,就会有n种可能
            if (i == start || chars[start] != chars[i]) { //去掉重复的可能情况
                swap(chars, i, start);  //交换当前下标到start位置
                permutationProcess(chars, start + 1, end); //全排列剩下字符串
                swap(chars, i, start); //再次交换,将他们还原,为下次交换首位置做准备
            }
        }
    }

    private void swap(char[] chars, int start, int end) {
        char tmp = chars[start];
        chars[start] = chars[end];
        chars[end] = tmp;
    }
}

你可能感兴趣的:(全排列)