LeetCode每日一题——T22. 括号生成(中):回溯算法——通用解法

回溯算法

采用回溯算法进行求解。其基本思想为:沿一条路往前走,走到头后,判断是否符合要求,然后返回上一个岔路口,换条路继续走,走到头继续判断是否符合要求,并返回上一个岔路口,如何该岔路口其他岔路也走过了,则再往上返回上个岔路口,如此往复,直到返回出发点。

例如本题,每个岔路就是在 字符串 S 中继续放 “(”还是放 “)”,结束条件是字符串长度是否等于 2 * n。假如 n = 3,则求解时,先生成解1:"((()))",满足结束条件,存入 res 中,然后回溯上一个岔路A:"((",此时换条路就变成,"(()",然后继续走下一个岔路B。走完后,在返回岔路A,岔路A下面的所有岔路均走过,继续返回岔路C:"(",换条路:"()",重复上述过程,直至返回到起点 " "。输出解空间。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = []
        # 设置空字符串 S 作为临时变量存储不完整解
        def BackTrack(S = "", left = 0, right = 0):     
            if len(S) == 2 * n:
                res.append(S)       # 当空字符串 S 长度满足要求时结束,存入 res 中
                return
            if left < n:        # left与right 用于判断结束条件与选择条件
                BackTrack(S + "(", left + 1, right)
            if right < left:
                BackTrack(S + ")", left, right + 1)
        
        BackTrack()
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值