力扣Hot100第22题——括号生成(python)

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

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

思路:1.类似前面的电话号码题,用回溯的方式。
当左括号小于n的时候我们可以添加左括号,当右括号小于左括号的时候可以添加右括号
例一中n=3
1.backtrack([],0,0)
1.1 因为left<3,所以添加(,回溯backtrack([‘(’],1,0)
1.1.1 因为left<3,所以添加(,回溯backtrack([‘(’,‘(’],2,0)
1.1.1.1 因为left<3,所以添加(,回溯backtrack([‘(’,‘(’,‘(’],3,0)

1.1.1.1.1 因为left=3,而right 1.1.1.1.1.1 因为left=3,而right 1.1.1.1.1.1.1 因为left=3,而right 1.1.1.1.1.1.1.1 因为len(s)==6,所以添加到res中,返回1.1.1.1.1.1.1
1.1.1.1.1.1.1 把) pop掉,返回上一步1.1.1.1.1.1 ([‘(’,‘(’,‘(’,‘)’,‘)’],3,2)
1.1.1.1.1.1 把) pop掉,返回上一步1.1.1.1.1 ([‘(’,‘(’,‘(’,‘)’],3,1)
1.1.1.1.1 把) pop掉,返回上一步1.1.1.1 ([‘(’,‘(’,‘(’],3,0)

1.1.1.1 把( pop掉,因为right 1.1.1.1.2 …

2.插空法
这里提供一个别人的解法,我觉得蛮神奇的
括号生成

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res=[]
        def backtrack(s,left,right):
            if(len(s)==2*n):
                res.append(''.join(s))
                return
            if left<n:
                s.append('(')
                backtrack(s,left+1,right)
                s.pop() #把原来加的左括号pop掉尝试别的可能 
            if right<left:
                s.append(')')
                backtrack(s,left,right+1)
                s.pop()
            return 
        backtrack([],0,0)
        return res





你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)