算法题(1)--全排列(用map代替判别数组)

95 阅读1分钟

介绍

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。简单的来说:给定一个没有重复数字的序列,返回其所有可能的全排列。

解决

image.png

const _permute = string => {
    // 结果集数组
    const res = [];
    // 元素获取数组
    let path = '';
    // 调用backTracking函数
    // 参数1:需要全排的数组 参数2:数组的长度 参数3:used数组记录当前元素是否已被使用


    // 递归函数
    function back(n, k, used) {
        // 当获取的元素个数等于传入数组长度时(此时说明找到了一组结果)
        if (path.length === k) {
            // 将这组数据存进结果集数组
            res.push(path);
            // 结束递归
            return;
        }
        for (let i = 0; i < k; i++) {
            if (used[i]) continue; // 当前元素已被使用, 结束此次循环
            path = path + n[i]; // 将符合条件的元素存进path数组
            console.log(i, "--++")
            console.log(path, "-----");
            used[i] = true; // 并将该元素标为true,表示已使用同支
            back(n, k, used);
            path = path.substring(0, path.length - 1)
            console.log(path, "++++");
            used[i] = false;
        }
    }
    back(Array.from(string), string.length, []);
    // 返回最后的结果
    return res;
};
console.log(_permute('abc'));
const _permute = string => {
    const result = []
    const map = new Map()
    const dfs = (path) => {
        if (path.length === string.length) {
            result.push(path)
            return
        }
        for (let i = 0; i < string.length; i++) {
            if (map.get(string[i])) continue
            map.set(string[i], true)
            path += string[i]
            dfs(path)
            path = path.substring(0, path.length - 1)
            map.set(string[i], false)
        }
    }
    dfs('')
    return result
};
console.log(_permute('abc'));