[Leetcode] 22. Generate Parentheses

Problem:

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:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

Idea:
1. Use a recursive function list all situations.
- For every situation, use a symbol to record the number of ‘(’ on the left side.
- If one ‘(’ is added into the string, the left number of ‘()’ to be added decreases by 1.
- When the function finishes, the symbol should be 0 and the left number should be 0, too.
2. Use Binary Tree. Constructing a Btree for every situation, regard left node as ‘(’ and right ‘)’. After listing all cases, use inorder traversal to all Btrees, which results come from.(But it seems not to be efficient, need some improvement.)

Solution: (for idea No.1)

class Solution(object):
    res = []
    def construct(self,symbol,num,string):
        if num == 0 and symbol == 0:
            self.res.append(string)
        elif symbol == 0:
            self.construct(symbol+1,num-1,string+"(")
        elif symbol > 0:
            self.construct(symbol-1,num,string+")")
            if num != 0:
                self.construct(symbol+1,num-1,string+"(")

    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        self.res = []
        if n == 1:
            return ["()"]
        self.construct(0,n,"")
        return self.res

Another good solutions from here
1. Here I wrote an actual Python generator. I allow myself to put the yield q at the end of the line because it’s not that bad and because in “real life” I use Python 3 where I just say yield from generate(…).

def generateParenthesis(self, n):
    def generate(p, left, right):
        if right >= left >= 0:
            if not right:
                yield p
            for q in generate(p + '(', left-1, right): yield q
            for q in generate(p + ')', left, right-1): yield q
    return list(generate('', n, n))

2.Parameter open tells the number of “already opened” parentheses, and I continue the recursion as long as I still have to open parentheses (n > 0) and I haven’t made a mistake yet (open >= 0).

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)

Ref:
about Python yield

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值