时间:2020-9-29
题目地址:力扣
题目难度:Medium
题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路1:回溯,深度优先
这题跟着覃超的视频写的。真的妙啊
为什么搜索几乎都是用深度优先遍历(回溯算法)。
广度优先遍历,得程序员自己编写结点类,显示使用队列这个数据结构。深度优先遍历的时候,就可以直接使用系统栈,在递归方法执行完成的时候,系统栈顶就把我们所需要的状态信息直接弹出,而无须编写结点类和显示使用栈。
代码段1:通过
# 第一版本,不考虑括号有效性,只往2n个格子里放括号
# class Solution:
# def generateParenthesis(self, n: int):
# self._generate(0, 2*n, "")
# def _generate(self, level, max, s):
# if level >= max:
# print(s)
# return
#
# self._generate(level+1, max, s + '(')
# self._generate(level+1, max, s + ')')
# 验证括号有效性
# 使用栈或简单验证
# 生成时判断 左 < n;右 < 左, [剪枝]
class Solution:
def __init__(self):
self.res = []
def generateParenthesis(self, n: int):
self._generate(0, 0, n, "")
print(self.res)
return self.res
def _generate(self, left, right, n, s):
if left == n & right == n:
self.res.append(s)
return
if left < n:
self._generate(left + 1, right, n, s + '(')
if right < left:
self._generate(left, right + 1, n, s + ')')
看下优化后的
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = []
def _generate(left, right, n, s):
if left == n & right == n:
res.append(s)
return
if left < n:
_generate(left + 1, right, n, s + '(')
if right < left:
_generate(left, right + 1, n, s + ')')
_generate(0, 0, n, "")
return res
总结:
-
这题真的厉害了,绝了,想不出来,得刻意练习了
-
刷题100天了,感觉没啥进步,得多思考总结了
2022-3-6
依旧没写出来,加油
后续优化:广度优先遍历力扣
动态规划力扣