全排列

题目

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

思想

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

代码

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

    public ArrayList<String> 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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容