题目描述:
示例:
解题思路:回溯 :通过确保每一步都能够实现有效序列,尽早实现剪枝;
我们首先找到回溯的出口条件:当左右括号都达到最大数量n时,加入结果集;
接下来以左括号开始,不断判断两个条件进行递归调用,直到满足出口条件:
(1)左括号是否达到最大数量n; 若小于,则使左括号数量加一,路径加上'(';
(2)左括号个数是否大于右括号个数; 若大于,则使右括号数量加一,路径加上')';
代码实现:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = [] # 保存结果
self.backtrack(res, n, 0, 0, '')
return res
def backtrack(self, res, n, left, right, path):
if left==n and right==n :
res.append(path)
return
if left < n :
self.backtrack(res, n, left+1, right,path+'(')
if left > right:
self.backtrack(res, n, left, right + 1, path + ')')
if __name__ == '__main__' :
test = Solution()
res = test.generateParenthesis(3)
print(res)