leetcode题解第22题 Generate Parentheses(括号生成)

题目的大意如下:

给定一个整数n,代表括号的对数,请给出所有合法的括号组合。

样例输入:

3

样例输出:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

题目链接:https://leetcode.com/problems/generate-parentheses/

解题思路:

生成n对括号,通过递归可以很轻松实现,问题的关键在于,什么样的生成式是正确的。

观察可以发现,合法的括号组合有如下特征:

  • 假设s是一个合法的括号组合,则在s的任意位置,左边的左括号的数量一定大于等于右括号的数量。

emmm,大家可以举几个例子看一下,都是满足的。那么,在满足特征的情况下,使用递归生成所有组合方式即可。

样例代码:

class Solution:
    # 最终的结果集
    result = set()
    # 用于临时存储递归生成的一种合法组合的列表
    curstring = []

    def dfs(self, leftcnt, rightcnt):
        """
        递归搜索所有可能的合法组合,并加入到结果集中
        :param leftcnt: 剩余可用左括号数
        :param rightcnt: 剩余可用右括号数
        :return:
        """
        # 当左右括号都用完了时,就得到了一个合法结果
        if leftcnt == 0 and rightcnt == 0:
            # 将组合拼接成字符串,加入结果集中
            self.result.add(''.join(self.curstring))
        # 现在,有两种放置方法,分别是在这里放左括号和右括号
        # 先看左括号,当左括号还有剩余时,就可以放置
        if leftcnt > 0:
            # 放置左括号
            self.curstring.append('(')
            # 剩余可用左括号的数量-1,继续放置下一个
            self.dfs(leftcnt - 1, rightcnt)
            # 回溯,撤销放置,尝试其他放置方法
            self.curstring.pop()
        # 再看右括号,当右括号还有剩余时
        if rightcnt > 0:
            # 并不能直接放置,还要满足剩余右括号的数量大于剩余左括号的数量才行
            # 也就是我们之前说的
            # `假设s是一个合法的括号组合,则在s的任意位置,左边的左括号的数量一定大于等于右括号的数量`
            if rightcnt - leftcnt > 0:
                # 放置右括号
                self.curstring.append(')')
                # 剩余可用右括号数量-1,继续放置下一个
                self.dfs(leftcnt, rightcnt - 1)
                # 回溯,撤销放置
                self.curstring.pop()

    def generateParenthesis(self, n: int):
        # 清空结果集
        self.result.clear()
        # 清空临时列表
        self.curstring.clear()
        # 递归搜索所有符合条件的结果
        self.dfs(n, n)
        # 结果获取完毕,以列表的形式返回结果
        return list(self.result)

转载请注明出处:https://blog.csdn.net/aaronjny/article/details/88765157

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值