BM60 括号生成(python)

题目

题目链接

给出正整数n,要求生成所有的由n对括号组成的合法组合
例如:n=3,生成:“((()))”, “(()())”, “(())()”, “()()()”, “()(())”

递归回溯

概括思路
若左括号未达到上限,优先在当前位置添加左括号,并对添加后的问题再求解;
若①左括号已达上限,或②本位置添加左括号后的问题已求解完,弹出了刚才添加的左括号,且当前还缺右括号,则添加右括号继续求解

有点别扭,画个图示意。。(n=2)
在这里插入图片描述

设置列表dst,存放所有生成的合法括号串
设置列表cell,存放当前已生成的字符串
设置变量leftright,记录当前cell中的左括号和右括号数量

进行递归:

  • 若cell长度已为2n,将其加入最终结果中,退递归
    否则:
  • 若当前左括号数量<n,说明还可以继续加左括号,添加一个左括号,对添加后的字符串继续递归,出递归后将刚才添加的左括号弹出(回溯)
  • 若当前右括号数量<左括号数量,说明缺少右括号,添加一个右括号,对添加后的字符串继续递归,出递归后将刚才添加的右括号弹出(回溯)

代码

class Solution:
    def rr(self, cell, dst, n, left, right):
        if len(cell) == n * 2:
            dst.append(''.join(cell))
            return
        # 左括号数量<n,添加左括号
        if left < n:
            cell.append('(')
            self.rr(cell, dst, n, left + 1, right)
            cell.pop()
        # 右括号数量<左括号,添加右括号
        if right < left:
            cell.append(')')
            self.rr(cell, dst, n, left, right + 1)
            cell.pop()

    def generateParenthesis(self, n):
        cell, dst = [], []
        left, right = 0, 0
        self.rr(cell, dst, n, left, right)
        return dst

参考链接:https://blog.nowcoder.net/n/83c55b7d50fd4cc6b5e4f56edabbdd03?f=comment

还有份之前写的代码,超时
思路是对每个位置插入左括号,再在左括号后插入右括号,继续递归

class Solution:
    def listToStr(self, arr):
        dst = ''
        for char in arr:
            dst += char
        return dst

    def rr(self, cell, dst, n):
        if len(cell) == n * 2:
            bracesStr = self.listToStr(cell)
            if bracesStr not in dst:
                dst.append(bracesStr)
            return
        for i in range(0, len(cell)):
            cell.insert(i, '(')
            for j in range(i + 1, len(cell)):
                cell.insert(j, ')')
                self.rr(cell, dst, n)
                cell.pop(j)
            cell.pop(i)

    def generateParenthesis(self, n):
        if n == 1:
            return ['()']
        cell, dst = ['(', ')'], []
        self.rr(cell, dst, n)

        return dst
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值