leetcode 22 括号生成

递归找到所有可能解,通过判断看解是否可行,进行筛选。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        hashmap={'(':')'}
        def check(s):
            balance=0
            stack=[]
            for i in s:
                if not stack or stack[-1] not in hashmap.keys() or hashmap[stack[-1]]!=i:
                    stack.append(i)
                else:
                    if stack[-1] in hashmap.keys() and hashmap[stack[-1]]==i:
                        stack.pop()
            if  stack:
                return False
            else:return True

        def dfs(t,n,result,allresult):

            if t==n:
                if check(result):
                    allresult.append(result)
                return 


            dfs(t+1,n,result+'(',allresult)
            dfs(t+1,n,result+')',allresult)
        allresult=[]
        dfs(0,n*2,'',allresult)

        return allresult

另一种判断生成的括号序列是否合法的方法,维护一个balance值,当序列中'('就加1,否则减1,这样在循环中如果就已经balance小于0,那么就是错的,说明")" 在前面了,最后如果balance等于0,那么就是正确的。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def check(s):
            balance=0
            for i in s:

                if i=='(':
                    balance+=1
                else:
                    balance-=1
                if balance<0:
                    return False
            return balance==0

        def dfs(t,n,result,allresult):

            if t==n:
                if check(result):
                    allresult.append(result[:])
                return 


            dfs(t+1,n,result+'(',allresult)
            dfs(t+1,n,result+')',allresult)
        allresult=[]
        dfs(0,n*2,'',allresult)

        return allresult

通过维护一个left,right变量,过程中"("的数量要一直大于")"的数量,最后返回答案的时候二者数量要相等。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def dfs(left,right,n,result,allresult):
            if right>left:return 
            if left==n and left==right:

                allresult.append(''.join(result))
                return 

            if left<n:
                dfs(left+1,right,n,result+'(',allresult)

            if right<n:
                dfs(left,right+1,n,result+')',allresult)

        allresult=[]
        dfs(0,0,n,'',allresult)

        return allresult
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务