题目:leetcode.22 Generate Parentheses
链接:https://leetcode.com/problems/generate-parentheses/#/description
原题:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]解题思路:
这周稍微回顾一下深搜,做题比较入门的找回感觉。看到题目很容易理解,找出所有括号配对的方法,一个简单的深搜就能搞定。大家可以把它理解成一个二叉树,简单来说每一层向下有两个选择,一个是填入左括号,另一个是填入右括号,但是并不是每一层都可以填入左括号或者右括号,左括号有数量限制就是n,右括号的限制就是目前数目不能多于左括号的数目。根据这两个条件去递归深搜,代码非常容易写出来。
下面展示两份代码,一份是自己写的,另一份是别人写的简洁版,膜拜一下别人的代码风格。
代码:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
ans = []
now = '('
self.cal_sol(n, ans, now, n-1, n)
return ans
def cal_sol(self, n, ans, now, left_num, right_num):
if len(now) == 2*n:
ans.append(now)
return
if left_num != 0:
self.cal_sol(n, ans, now+'(', left_num-1, right_num)
if left_num < right_num:
self.cal_sol(n, ans, now+')', left_num, right_num-1)
return
def generateParenthesis(self, n):
def generate(p, left, right, parens=[]):
if left: generate(p + '(', left-1, right)
if right > left: generate(p + ')', left, right-1)
if not right: parens += p,
return parens
return generate('', n, n)
def generateParenthesis(self, n, open=0):
if n > 0 <= open:
return ['(' + p for p in self.generateParenthesis(n-1, open+1)] + \
[')' + p for p in self.generateParenthesis(n, open-1)]
return [')' * open] * (not n)