leetcode22. 括号生成python-动态规划篇

题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8

思路和代码

在leetcode找到这题真的很难受啊,因为是我58同城面试题原题,我曾经刷到过这题,但是没写出来。今天我在上次面试后刷一遍的基础上又刷一遍,还是不会啊。啊,我怎么这么笨啊!我这么笨还不努力刷题,回来到公司上班不裁我裁谁啊。

再次刷这道题,印象中有生成新的一种括号的关键代码:

new = "(" + k1 + ")" + k2

隐约中还记得有四层for循环,有k1和k2。初始的时候列表res有两个列表元素,[None]和[“()”]。

靠着这些记忆而不是理解开始写代码,问题来了。外面两层for循环的起始位置和终止位置是什么?k1和k2在哪里面循环?

重新看了一下代码,说一下现在的理解。

最外层循环i从2到n+1,为什么?首先得知道res里面存放的是n=i时所有的正确括号组合。所以初始时有res=[[None],[“()”]],最终返回的是res[n]。

第二层的循环j是从0到i,目的是把当前res[i]分成前后两部分k1和k2。因为res[i+1]的正确括号组合是通过res[i]得到的,如何得到,就是把res[i]不断的分成前后两部分,然后利用"(" + k1 + “)” + k2来生成新的括号组合。

所以k1的循环是在res[j],k2的循环是在res[i-j-1]。就像最开始k1=res[0],k2=res[1]。

当k1或者k2等于None时,由于新的括号是(" + k1 + “)” + k2,所以将其置为“”。

代码:

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = [[None],["()"]]
        for i in range(2,n+1):
            ans = []
            for j in range(i):
                pre = res[j]
                last = res[i-j-1]
                for k1 in pre:
                    for k2 in last:
                        if k1 == None:
                            k1 = ""
                        if k2 == None:
                            k2 = ""
                        ans.append("("+k1+")"+k2)
            res.append(ans)
        return res[n]
   

唉,我怎么那么聪明!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值