Leetcode 剑指 Offer 38. 字符串的排列 (回溯法、深度遍历 + 剪枝)

原题链接
题解写的很好,请参考题解

回溯法 (深度遍历 + 剪枝)

class Solution {
    // 返回结果字符串的List集合
    private List<String> res = new LinkedList<>();
    // 字符串s的字符数组sArray
    private char[] sArray;

    public String[] permutation(String s) {
        sArray = s.toCharArray();
        dfs(0);
        return res.toArray(new String[0]);
    }

    /**
     * 深度遍历 + 剪枝
     * @param x 递归的层级,也是字符串当前固定的位置
     */
    public void dfs(int x){
        // 已经到了字符串的最后一个位置
        if (x == sArray.length - 1) {
            res.add(new String(sArray));
            return;
        }

        // 在x位置上的字母的Set集合,不允许重复
        Set<Character> cSet = new HashSet<>();

        for (int i = x; i < sArray.length; i++){
            // 如果出现重复字母,及时剪枝
            if(cSet.contains(sArray[i]))
                continue;

            cSet.add(sArray[i]);
            // 通过交换模拟排列
            swap(i, x);
            dfs(x + 1);
            // 恢复sArray
            swap(i, x);
        }
    }


    /**
     * 交换sArray[i]和sArray[j]
     * @param i
     * @param j
     */
    public void swap(int i, int j){
        char temp = sArray[i];
        sArray[i] = sArray[j];
        sArray[j] = temp;
    }
}

你可能感兴趣的:(Leetcode算法题,数据结构与算法,字符串,剪枝,dfs,leetcode,算法)