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


public class Main {
    public ArrayList permutation(String str) {
        ArrayList list = new ArrayList<>();
        if (str == null || str.length() == 0) {
            return list;
        }
        collect(str.toCharArray(), 0, list);
        Collections.sort(list);
        return list;
    }

    public static void collect(char[] chars, int begin, ArrayList list) {
        if (begin == chars.length - 1) {
            // 不能存入相同的排列
            String s = String.valueOf(chars);
            if (!list.contains(s)) {
                list.add(s);
                return;
            }
        }

        for (int i = begin; i < chars.length; i++) {//大的循环,需要控制第一个逐个和后面的交换
            swap(chars, i, begin);
            collect(chars, begin + 1, list);
            swap(chars, i, begin);
        }

    }

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

    public static void main(String[] args) {
        Main a = new Main();
        System.out.println(a.permutation("abc"));
    }
}

你可能感兴趣的:(牛客网-递归的使用:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。)