程序员面试金典---13

无重复字符全排列

思路:

使用回溯进行解决。

主要是定义一个backRound函数,表示回溯。

注意回溯出口:就是长度等于S的长度,且没有存储。

代码:

var permutation = function(S) { // 定义函数 permutation,接收字符串 S 作为参数
    let res = [] // 初始化一个存储全排列结果的数组

    function backRound(path, selectList){ // 定义回溯函数 backRound,接收当前已选择的字符序列 path 和剩余可选字符列表 selectList 作为参数
        if(path.length === S.length){ // 当当前字符序列长度等于 S 的长度时,说明已经选择完毕
            if(res.indexOf(path) === -1){ // 如果该结果没有被存储过,则将其存入结果数组中
                res.push(path)
            }
            return // 结束递归
        }

        for(let i = 0; i < selectList.length; i++){ // 遍历剩余可选字符列表
            path += selectList[i] // 将当前字符添加到已选择的字符序列中
            backRound(path, selectList.slice(0, i) + selectList.slice(i + 1)) // 递归调用回溯函数,传入更新后的 path 和 selectList
            path = path.slice(0, path.length - 1) // 将添加的字符从 path 中删除,继续遍历下一个字符
        }
    }

    backRound('', S) // 初始化回溯函数,并开始搜索全排列结果
    return res // 返回存储所有全排列结果的数组
};

有重复字符串的全排列

思路:

和上题一样的思路:

/**
 * @param {string} S
 * @return {string[]}
 */
var permutation = function(S) {
    let res = []

    function backRound(path, selectionList){
        if(path.length === S.length){
            if(res.indexOf(path) === -1){
                res.push(path)
            }
            return
        }

        for(let i = 0; i < selectionList.length; i++){
            path += selectionList[i]
            backRound(path, selectionList.slice(0, i) + selectionList.slice(i + 1))
            path = path.slice(0, path.length - 1)
        }
    }

    backRound('', S)
    return res
};

括号

思路:

递归搜索:

var generateParenthesis = function(n) {  //定义一个函数,生成有效括号组合,参数为 n
    let res = [];  // 定义结果数组用于存储最终的结果
    dfs(n, n, '', res);  //调用dfs函数进行深度优先搜索,并将结果存到res中
    return res;  //返回结果数组
};

function dfs(m, n, output, res) {  //定义一个深度优先搜索算法的递归函数,传入参数 m、n、output和res
    if(m > n || m < 0 || n < 0) return;  // 当左括号数量大于右括号数量或者不足时直接返回
    if(m === 0 && n === 0) res.push(output);  //当左右括号的数量都等于零时将当前结果字符串推入结果数组res
    dfs(m - 1, n, output + '(', res);  // 继续递归调用dfs函数,左括号的数量减一之后加入左括号
    dfs(m, n - 1, output + ')', res);  // 继续递归调用dfs函数,右括号的数量减一之后加入右括号
}
posted @   楸枰~  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示