***剑指 Offer 38. 字符串的排列

感觉是比较难的一道题了,写一下思路以及运行流程。

举例 s = "abc"

1.首先将字符串s存入字符数组便于操作,进入dfs(0)

2.进入循环,交换‘a’和‘a’(相当于没变),进入dfs(1)

3.进入循环,交换‘b’和‘b’,进入dfs(2)

4.触发终止条件,把此时的字符串c转为String存入res

5.跳回dfs(1),交换‘b’和‘b’,进入下一层循环,x = 1, i = 2

6.交换‘b’和‘c’……将此时c转为String存入res……把‘b’和‘c’换回去。

 

7.一路回到dfs(0),进入dfs(0)的下一层循环,x = 0, i = 1;

8.交换‘a’和‘b’,进入dfs(1)

………………

 

class Solution {
    char[] c;
    List<String> res = new ArrayList<>();

    public String[] permutation(String s) {
        //字符数组c,用来存放原字符串
        c = s.toCharArray();
        //dfs的参数是下标
        dfs(0);
        return res.toArray(new String[res.size()]);
    }

    void dfs(int x){
        //所有位置已经固定好,转为String存入res
        if(x == c.length - 1){
            res.add(String.valueOf(c));
            return;
        }
        HashSet<Character> set = new HashSet<>();
        for(int i = x; i < c.length; i++){
            //如果有重复字符则剪枝
            if(set.contains(c[i])) continue;
            set.add(c[i]);
            //将字符 c[i] 和 c[x] 交换,即固定 c[i] 为当前位字符
            swap(x, i);
            //开始固定第 x + 1 个字符;
            dfs(x + 1);
            //还原到交换之前
            swap(x, i);
        }
    }

    //因为是全局变量所有可以这样交换
    void swap(int a, int b){
        char tmp = c[a];
        c[a] = c[b];
        c[b] = tmp;
    }
}

 

posted @ 2021-04-02 16:02  星予  阅读(34)  评论(0编辑  收藏  举报