leetcode-22-括号生成

1,552 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

题目地址

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入: n = 1
输出: ["()"]

提示:

  • 1 <= n <= 8

解题思路

本题要求我们根据给出的整数 n 生成所有可能且有效的括号组合。根据题意可以,数字 n 就是生成括号的对数,表示我们有 n(n) 可用。
而组合结果的过程,无非就两种可能,要么再拼一个 (,要么再拼一个 ),所以我们在括号没有用完的时候,不停选择左右括号进行组合即可,当左右括号都用完,则完成一组可能的结果,将其添加到结果数组中即可。
因为是不停选择左括号或者右括号进行组合,所以很适合用递归来实现。
首先我们明确递归函数的退出条件是左右括号都用完。
其次,因为要保证括号组合有效,所以当剩余左右括号数量相同时,这个时候,要保证下一个拼接的一定是左括号。
所以我们的递归函数需要传入四个参数:

  1. 左括号剩余数量
  2. 右括号剩余数量
  3. 当前拼接字符串结果
  4. 结果数组 最后,调用该函数,并返回其返回值即可。

代码实现

function getRes(l,r,str,res){
    if(l === 0 && r === 0){
        res.push(str)
        return
    }

    if(l === r){
        getRes(l-1,r,str+'(',res)
    }else{
        if(l){
            getRes(l-1,r,str+'(',res)
        }

        if(r){
            getRes(l,r-1,str+')',res)
        }
    }

    return res
}

var generateParenthesis = function(n) {
    return getRes(n,n,'',[])
}

至此我们就完成了 leetcode-22-括号生成

如有任何问题或建议,欢迎留言讨论!