[LeetCode]22. Generate Parentheses

22. Generate Parentheses

题意:给定括号个数,生成相互对应的括号组合。

回溯

纪录两边的括号的个数,注意每当右边括号数目和左边数目不再相等的时候,那么需要进行补齐右边的括号。

增加的形式:

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        def helper(cur, left, right):
            if len(cur) == 2 * n :
                res.append(cur)
                return
            if left < n:
                helper(cur+'(', left+1, right)
            if right < left:
                helper(cur+')', left, right+1)
        if n == 0:
            return []
        res = []
        helper('', 0, 0)
        return res

相减的形式:

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        def helper(cur, left, right):
            if not left and not right:
                res.append(cur)
                return
            if left:
                helper(cur + '(', left - 1, right)
            if right > left:
                helper(cur + ')', left, right - 1)
        if n == 0:
            return []
        res = []
        helper('', n, n)
        return res

记忆化DFS(Memorial DFS)

先看个例子:

f(0): ""
f(1): "("f(0)")"
f(2): "("f(0)")"f(1), "("f(1)")"
f(3): "("f(0)")"f(2), "("f(1)")"f(1), "("f(2)")"
所以 f(n) = "("f(0)")"f(n-1) , "("f(1)")"f(n-2) "("f(2)")"f(n-3) ... "("f(i)")"f(n-1-i) ... "(f(n-1)")"

我们可以发现,f(n)的结果就是往f(n-1)上加上括号即可,具体来看,其中每一个值都是让f(i)放到括号里面,而f(n-1-i)则放到括号外面,假定dp[n]代表f(n),也就是括号个数为n的结果,即题目求的结果,公式为:

f(n) = ( f(i) ) f(n - 1 - i)

下面代码重点在于,先循环n,接着循环从中选择i,再进行循环从中选择剩下的n-1-i;

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        dp = {0: [""], 1: ["()"]}
        def memorial_dfs(n):
            if n not in dp:
                dp[n] = []
                for i in range(n):
                    for inner in memorial_dfs(i):
                        for outter in memorial_dfs(n - i - 1):
                            dp[n].append('(' + inner + ')' + outter)
            return dp[n]
        return memorial_dfs(n)
posted @ 2017-08-25 06:18  banananana  阅读(96)  评论(0)    收藏  举报