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
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务