回溯算法-括号生成

22.括号生成
回溯算法-括号生成_第1张图片
思路:先用回溯算法生成所有可能的括号,再判断生成的括号是否为有效括号。
对于有效括号的判断,leetcode也有一道专门的题,用栈辅助就可以很简单的解决。整体代码也没啥,就是回溯+有效括号的判断

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = []
        arr = ['(', ')']
        length = 2 * n
        def is_valid(s):  #判断括号是否有效
            stack = []
            #从后向前遍历,遇到')'就加入栈中,遇到'('就弹出栈顶元素
            for i in range(length-1, -1, -1):
                if s[i] == ')':
                    stack.append(')')
                else:
                    if stack:
                        stack.pop()
                    else:
                        return False
            return False if stack else True  #如果是有效括号,栈最终肯定是空的

        def backtrace(s):  #回溯部分就没啥特别的,套模板
            if len(s) == length and is_valid(s): #终止条件
                if not s in res:
                    res.append(s)
            for i in range(2):
                if len(s + arr[i]) > length: #剪枝
                    break
                s += arr[i]
                backtrace(s)
                s = s[:-1]
        backtrace('')
        return res

你可能感兴趣的:(回溯算法-括号生成)