22. 括号生成(中)

题目

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

示例 1:

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

示例 2:

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

python

题解:回溯+剪枝

  • 首先翻译一下题目:现在有2n个位置,每个位置可以放'('或者')',组成的所有括号组合中,有多少个是合法的?并保存输出。
  • 思路:先把所有的括号组合穷举出来,在筛选合法的即可
  • 合法的性质:左括号数量等于右括号;对于一个合法的括号字符串p,必然对于任何0<=i<len(p)都有:子串p[0...i]中的左括号数量都大于等于右括号数量
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def backtrack(left: int, right: int, track: List[str], res: List[str]):
            # 如果右括号数目小于左括号数目,说明当前组合是无效的,直接返回
            if right < left:
                return
            # 如果左括号或右括号的数目小于 0,说明当前组合是无效的,直接返回
            if left < 0 or right < 0:
                return
            # 如果左括号和右括号的数目都为 0,说明找到了一个有效的括号组合,将其加入结果列表 res 中
            if left == 0 and right == 0:
                res.append("".join(track))
                return
            
            # 尝试添加一个左括号到当前组合中,并进行递归调用
            track.append('(')#选择
            backtrack(left - 1, right, track, res)
            track.pop()  # 回溯,移除最后添加的左括号

            # 尝试添加一个右括号到当前组合中,并进行递归调用
            track.append(')')#选择
            backtrack(left, right - 1, track, res)
            track.pop()  # 回溯,移除最后添加的右括号

        if n == 0:
            return []

        track = []  # 用于追踪当前的括号组合
        res = []  # 保存有效的括号组合
        backtrack(n, n, track, res)  # 调用回溯函数生成括号组合
        return res  # 返回结果列表

javascript

题解:回溯

var generateParenthesis = function(n) {
    const res = [] // 存放结果的数组
    const track = [] // 当前路径的数组

    const dfs=(left,right)=>{
        //递归出口,当左右括号都用完时,将当前组合加入结果集
        if(left === 0 && right ===0){
            res.push(track.join(''))
            return
        }
        //做选择,选左括号还是右括号,选择右括号的限制条件是前面有左括号

        // 选择左括号:如果还有左括号可以用
        if(left>0){
            track.push('(')// 做选择,加入左括号
            dfs(left-1, right)// 递归调用,减少一个左括号
            track.pop() // 撤销选择,回溯
        }
        // 选择右括号:如果右括号的数量大于左括号的数量
        if(right>left){
            track.push(')')// 做选择,加入右括号
            dfs(left,right-1)// 递归调用,减少一个右括号
            track.pop()// 撤销选择,回溯
        }
    }
    dfs(n,n)// 初始化,左右括号的数量都为 n
    return res
};
posted @   Frommoon  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示