08.08. 有重复字符串的排列组合qaq

34 阅读1分钟

image.png

/**
 * @param {string} S
 * @return {string[]}
 */
var permutation = function(S) {
    // 存储结果的数组
    let ans = []
    // 存储当前排列的数组
    let path = []
    // 将字符串 S 转换为数组后进行排序得到的数组
    let choice = S.split('').sort()

    // 定义回溯函数
    function trace(){
        // 如果找到了一个完整的排列,将其转换为字符串并放入结果数组中
        if (path.length === S.length) ans.push(path.join(''))
        
        // 遍历选择数组
        for (let i = 0; i < choice.length; i++){
            // 进行一些剪枝操作,排除已经被选择过的元素以及连续重复的元素
            if (choice[i] == null || i > 0 && choice[i] == choice[i-1]) continue

            // 选择当前元素,并将其从选择数组中移除
            let tmp = choice[i]
            choice[i] = null

            // 将选择的元素添加到当前排列数组中
            path.push(tmp)

            // 递归调用,继续向下搜索
            trace()

            // 恢复之前的状态,即从当前排列数组中移除选择的元素,并将其放回选择数组的相应位置
            path.pop()
            choice[i] = tmp
        }

    }

    // 调用回溯函数
    trace()

    // 返回结果数组
    return ans
};

面试题 08.08. 有重复字符串的排列组合 - 力扣(LeetCode)