题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解答:借鉴一下别人的方法,记录一下自己的理解。

思路:
1:"a"和"b"肯定是不同的排列
2:通过交换字符来生成不同的排列
3:举例:"abc"的全排列即{(a+"bc"的全排列),(b+"ac"的全排列),(c+"ab"的全排列)},就是将第一个字符和后面任意一个字符交换,一直递归至只剩一个字符。

public class Q_27 {

ArrayList<String> Permutation(String str) {
    ArrayList<String> list = new ArrayList<String>();
    if (str.length() >= 1) {
        PermutationHelper(str.toCharArray(), 0, list);
        Collections.sort(list);
    }
    return list;
}

private void PermutationHelper(char[] chars, int i, ArrayList<String> list) {
    if (i == chars.length - 1) {//只剩最后一个字符则添加到list
        list.add(String.valueOf(chars));
    } else {
        Set<Character> set = new HashSet<>();
        for (int j = i; j < chars.length; j++) {//循环交换后续的每一个字符
            if (!set.contains(chars[j])) {//保证重复的字符不交换
                set.add(chars[i]);
                swap(chars, i, j);
                PermutationHelper(chars, i + 1, list);
                swap(chars, i, j);
            }
        }
    }
}
private void swap(char[] cs, int i, int j) {
    char temp = cs[i];
    cs[i] = cs[j];
    cs[j] = temp;
}

public static void main(String[] args) {
    System.out.println(new Q_27().Permutation("asdfghjk"));
}

}