面试题 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。
原文地址:https://www.cnblogs.com/USTC-ZCC/p/12736721.html