JZ38. 字符串的排列

38 阅读1分钟

输入一个字符串,打印出该字符串中字符的所有排列。

 

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

 

示例:

输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]  

限制:

1 <= s 的长度 <= 8

image.png

image.png

image.png

image.png

class Solution {
    private List<String> result = new LinkedList<>();
    private char[] c;

    public String[] permutation(String s) {
        c = s.toCharArray();
        dfs(0);
        return result.toArray(new String[result.size()]);
    }

    public void dfs(int x) {
        if (x == c.length - 1) {
            result.add(String.valueOf(c));
            return;
        }
        HashSet<Character> set = new HashSet<>();

        for (int i = x; i < c.length; i++) {
            if (!set.contains(c[i])) {
                set.add(c[i]);
                swap(i, x);
                dfs(x + 1);
                swap(i, x);
            }
        }
    }

    public void swap(int a, int b) {
        char temp = c[a];
        c[a] = c[b];
        c[b] = temp;
    }
}