mengjian-github / leetcode

leetcode前端题目笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

剑指 Offer 38. 字符串的排列

mengjian-github opened this issue · comments

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

 

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

 

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zi-fu-chuan-de-pai-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

典型的回溯算法,但要注意的是字符串中可能有重复字母,这需要用下标来标记,并且结果要去重:

/**
 * @param {string} s
 * @return {string[]}
 */
var permutation = function(s) {
    const result = [];
    let visited = [];

    function backtrack(trace = '') {
        if (trace.length >= s.length) {
            if (!result.includes(trace)) {
                result.push(trace);
            }
            return;
        }

        for (let i = 0; i < s.length; i++) {
            if (!visited[i]) {
                trace += s[i];
                visited[i] = s[i];
                backtrack(trace);
                trace = trace.slice(0, -1); // 回溯
                visited[i] = false;;
            }
        }
    }

    backtrack();

    return result;
};