力扣热题100_回溯_22_括号生成

文章目录


题目链接

22. 括号生成

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

示例 1:

输入:n = 3

输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1

输出:["()"]

解题思路

下面我们根据回溯算法三步走,写出对应的回溯算法。

明确所有选择:括号组合中的每个位置,都可以从 ( 或者 ) 中选出。并且,只有在 symbol < n 的时候,才能选择 (,在 symbol > 0 的时候,才能选择 )。

明确终止条件:当遍历到决策树的叶子节点时,就终止了。即当前路径搜索到末尾时,递归终止。

将决策树和终止条件翻译成代码:

  • 定义回溯函数:
    • backtracking(symbol, index): 函数的传入参数是 symbol(用于表示是否当前组合是否成对匹配),index(当前元素下标),全局变量是 parentheses(用于保存所有有效的括号组合),parenthesis(当前括号组合)。
    • backtracking(symbol, index) 函数代表的含义是:递归根据 symbol,在 ( 和 ) 中选择第 index 个元素。
  • 书写回溯函数主体(给出选择元素、递归搜索、撤销选择部分)。
    • 从当前正在考虑元素,到第 2 * n 个元素为止,枚举出所有可选的元素。对于每一个可选元素:
      • 约束条件:symbol < n 或者 symbol > 0。
      • 选择元素:将其添加到当前括号组合 parenthesis 中。
      • 递归搜索:在选择该元素的情况下,继续递归选择剩下元素。
      • 撤销选择:将该元素从当前括号组合 parenthesis 中移除。
python 复制代码
if symbol < n:
	parenthesis.append('(')
	backtrack(symbol + 1, index + 1)
	parenthesis.pop()
if symbol > 0:
	parenthesis.append(')')
	backtrack(symbol - 1, index + 1)
	parenthesis.pop()
  • 明确递归终止条件(给出递归终止条件,以及递归终止时的处理方法)。
    • 当遍历到决策树的叶子节点时,就终止了。也就是当 index == 2 * n 时,递归停止。
    • 并且在 symbol == 0 时,当前组合才是有效的,此时将其加入到最终答案数组中。

解题代码

python 复制代码
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        parentheses = []
        parenthesis = []
        def backtrack(symbol, index):
            if n * 2 == index:
                if symbol == 0:
                    parentheses.append("".join(parenthesis))
            else:
                if symbol < n:
                    parenthesis.append('(')
                    backtrack(symbol + 1, index + 1)
                    parenthesis.pop()
                if symbol > 0:
                    parenthesis.append(')')
                    backtrack(symbol - 1, index + 1)
                    parenthesis.pop()
        backtrack(0, 0)
        return parentheses

参考资料:datawhalechina

相关推荐
tobias.b3 小时前
408真题解析-2010-6-数据结构-哈夫曼树
数据结构·计算机考研·408真题解析
tobias.b4 小时前
408真题解析-2010-7-数据结构-无向连通图
数据结构·算法·图论·计算机考研·408真题解析
良木生香5 小时前
【鼠鼠优选算法-双指针】003:快乐数 & 004:盛水最多的容器
算法
Cx330❀5 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
沃尔特。6 小时前
直流无刷电机FOC控制算法
c语言·stm32·嵌入式硬件·算法
CW32生态社区6 小时前
CW32L012的PID温度控制——算法基础
单片机·嵌入式硬件·算法·pid·cw32
Cx330❀6 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
漫随流水6 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
燃于AC之乐6 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑6 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl