牛客(27)字符串的排列

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

    //    输入描述:
//    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
    public static ArrayList<String> Permutation(String str) {
        ArrayList<String> arrayList = new ArrayList<String>();
        char[] chars = str.toCharArray();
        Permutation(chars, 0, arrayList);
//      按字典序打印
        TreeSet<String> strings = new TreeSet<String>(arrayList);
        arrayList.clear();
        arrayList.addAll(strings);
        return arrayList;
    }

    public static void Permutation(char[] chars, int start, ArrayList<String> arrayList) {
        //结束条件
        if (start > chars.length - 1 || chars == null) {
            return;
        }

        if (start == chars.length - 1) {
            arrayList.add(String.valueOf(chars));
        } else {

            for (int i = start ; i < chars.length; i++) {
                if (i==start){
                    //start 是第一个
                    Permutation(chars, start + 1, arrayList);
                }else{
                    //start 不是第一个
                    //交换
                    swap(chars, start, i);

                    Permutation(chars, start + 1, arrayList);

                    //恢复
                    swap(chars, start, i);
                }
            }
        }
    }

    public static void swap(char[] chars, int start, int end) {
        char temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
    }

 

posted @ 2018-05-11 15:25  楷兵  阅读(119)  评论(0编辑  收藏  举报