设为首页 加入收藏

TOP

LeetCode----Generate Parentheses
2015-11-21 00:54:31 来源: 作者: 【 】 浏览:1
Tags:LeetCode----Generate Parentheses

Generate Parentheses

?

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:

((())), (()()), (())(), ()(()), ()()()


分析:

生成合法的括号串。

?

递归:

每次先判断当前串中的左括号数目是否大于等于右括号数目,如果成立,那么向当前子串中添加左括号或者右括号。

?

Python代码:

?

class Solution(object):
    def generateParenthesis(self, n):
        
        :type n: int
        :rtype: List[str]
        
        res = []
        self.dfs('', n, res)
        return res

    def dfs(self, cur_s, n, res):
        if len(cur_s) == 2 * n:
            res.append(cur_s)
            return
        l_n, r_n = cur_s.count('('), cur_s.count(')')
        if l_n >= r_n:
            if l_n < n:
                self.dfs(cur_s + '(', n, res)
            if r_n < n:
                self.dfs(cur_s + ')', n, res)

对应的C++代码:

?

?

class Solution {
public:
    vector
  
    generateParenthesis(int n) {
        vector
   
     res; dfs(, 0, 0, n, res); return res; } void dfs(string cur_s, int l, int r, int n, vector
    
      & res){ if(cur_s.length() == 2 * n){ res.push_back(cur_s); return; } if(l >= r){ if(l < n){ dfs(cur_s + '(', l+1, r, n, res); } if(r < n){ dfs(cur_s + ')', l, r+1, n, res); } } } };
    
   
  


?

别人家的代码:

\

Discuss中看到的动态规划:

?

To generate all n-pair parentheses, we can do the following:

  1. Generate one pair: ()
  2. Generate 0 pair inside, n - 1 afterward: () (...)...

    Generate 1 pair inside, n - 2 afterward: (()) (...)...

    ...

    Generate n - 1 pair inside, 0 afterward: ((...))

    I bet you see the overlapping subproblems here. Here is the code:

    (you could see in the code that x represents one j-pair solution and y represents one (i - j - 1) pair solution, and we are taking into account all possible of combinations of them)

    class Solution(object):
        def generateParenthesis(self, n):
            
            :type n: int
            :rtype: List[str]
            
            dp = [[] for i in range(n + 1)]
            dp[0].append('')
            for i in range(n + 1):
                for j in range(i):
                    dp[i] += ['(' + x + ')' + y for x in dp[j] for y in dp[i - j - 1]]
            return dp[n]

    ?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇LeetCode 23 Merge k Sorted Lists 下一篇C++中现成的hash函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: