46. 全排列

55 阅读1分钟

46. 全排列

image.png

解题思路

  1. dfs 递归函数
  2. 首先判断是否所有位置都占据满了 即 path.length === letters.length,符合 push 进 res
  3. 如果站位已经占据,则 continue ,否则将占位符设置为 true
  4. 递归调用 dfs
  5. path.pop() used[i] = false 进行回溯

代码

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(letters) {
    let res = [];
    dfs(letters, [], Array(letters.length).fill(false), res);
    return res;
}

function dfs(letters, path, used, res) {
    if (path.length === letters.length) {
        // 深度复制
        res.push([...path]);
        return;
    }
    for (let i = 0; i < letters.length; i++) {
        // skip used letters
        if (used[i]) continue;
        // add letter to permutation, mark letter as used
        path.push(letters[i]);
        used[i] = true;
        dfs(letters, path, used, res);
        // remove letter from permutation, mark letter as unused
        path.pop();
        used[i] = false;
    }
}