sl1673495 / leetcode-javascript

:beers: 喝杯小酒,一起做题。前端攻城狮从零入门算法的宝藏题库,根据知名算法老师的经验总结了 100+ 道 LeetCode 力扣的经典题型 JavaScript 题解和思路。已按题目类型分 label,一起加油。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

有重复字符串的排列组合-面试题 08.08

sl1673495 opened this issue · comments

commented

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

示例1:

 输入:S = "qqe"
 输出:["eqq","qeq","qqe"]
示例2:

 输入:S = "ab"
 输出:["ab", "ba"]
提示:

字符都是英文字母。
字符串长度在[1, 9]之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-ii-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

每轮递归中循环当前剩余的单词,尝试以单词中的每个字母拼接在上次递归后形成的字符串后面,并且用剩下的字母继续递归拼接,直到拼接的长度等于 S 的长度,即可作为一个结果放入 res 中。

注意剪枝部分的逻辑,每轮递归中,假设我们已经尝试过用 q 来拼接了,那么就记录在这轮递归的 visited 中,循环中再遇到 q 直接跳过即可,因为得到的结果一定是重复的。

这个评分结果不是很稳定,不过比较好的时候能跑赢 80% 左右。

/**
 * @param {string} S
 * @return {string[]}
 */
let permutation = function (S) {
    let res = []
    let helper = (prev, rest) => {
        if (prev.length === S.length) {
            res.push(prev)
            return
        }

        let visited = {}
        for (let i = 0; i < rest.length; i++) {
            let char = rest[i]
            if (visited[char]) {
                continue
            }
            visited[char] = true
            helper(prev + char, rest.substring(0, i) + rest.substring(i + 1))
        }
    }
    helper('', S)
    return res
};