题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
- 1 <= n <= 8
解题方法
暴力法
首先遍历所有可能的情况,再筛选有效的情况,这里参考“有效的括号”这一做过的题目思路。
回溯法
在暴力法的基础上优化,只在序列仍然保持有效时才添加 ‘(’ 或者 ‘)’,不是每次添加。
通过跟踪截止目前放置的左括号和右括号的数目,如果左括号数量不大于 n,放一个左括号;如果右括号数量小于左括号的数量,放一个右括号。
提交代码
暴力法
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(s):
if len(s) == 2*n:
if isvalid(s):
res.append("".join(s))
else:
s.append('(')
generate(s)
s.pop()
s.append(')')
generate(s)
s.pop()
def isvalid(s):
count = 0
for i in s:
if i == '(': count += 1
else: count -= 1
if count < 0: return False
return count == 0
res = []
generate([])
return ans
回溯法
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = []
def backtrack(S, left, right):
if len(S) == 2 * n:
res.append(''.join(S))
return
if left < n:
S.append('(')
backtrack(S, left+1, right)
S.pop()
if right < left:
S.append(')')
backtrack(S, left, right+1)
S.pop()
backtrack([], 0, 0)
return res
学习总结
- 函数里进行递归,只需要写出每一次判断的情况,具有相同的规律
- 暴力法还是首先想到的,从栈的思路上下手,分析括号类的题目思路更加有序条理。