题目描述

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

思路:递归

通过循环先固定字符串的首字符,然后将首字符后面的字符递归地进行排列

实现

    public ArrayList<String> Permutation(String str){
        //终止条件,只剩一个字符的情况,直接返回ArrayList结果
        if(str.length()==1){
            ArrayList<String> list=new ArrayList<>();
            list.add(str);
            return list;
        }

        ArrayList<String> list=new ArrayList<>();
        //递归
        //遍历str字符找不同的开头
        for(int i=0;i<str.length();i++){
            //去掉开头的字符,将后续的字符串进行递归.
            for(String s:Permutation(str.substring(0,i)+str.substring(i+1,str.length()))){
                list.add(str.charAt(i)+s);
            }
        }
        //利用HashSet进行去重,Collections的sort方法排序
        HashSet<String> hs = new HashSet(list);
        ArrayList<String> list_new=new ArrayList<>(hs);
        Collections.sort(list_new);
        return list_new;
    }