面试题 08.09. 括号
设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = [] # 定义结果变量
state = "" # 定义状态变量
def get_res(state,p,q):
if p > q: # 不满足合法条件
return
elif len(state) == 2*n: # 达成最终目标的结果
res.append(state)
return
if p>0: # 满足执行条件
get_res(state+"(",p-1,q)
if q>0: # 满足执行条件
get_res(state+")",p,q-1)
get_res(state,n,n)
return res
说明: p是左括号的剩余个数,q是右括号的剩余个数。
递归过程就是。如果左括号还有剩余,那就试试左括号;如果右括号还有剩余,那就试试右括号。
stack是当前字符串,试哪个括号就要在后面加哪个括号。如果试左括号,p就减1,因为用掉了一个;如果试右括号,q就减1。