LeetCode 刷题记录 22. 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:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解法1:递归法 参考LeetCode 刷题记录 17. Letter Combinations of a Phone Number
递归函数参数为左括号和右括号的数目 当左右括号为n时,递归结束
注意剪枝:右括号的数目大于左括号的数目时,不是有效的括号组合,如"())",应予以排除,另外注意左右括号不应超过n
c++:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        
        DFS(0, 0, "", n, res);
        return res;
    }
    void DFS(int left, int right, string path, int n, vector<string>& res){
        if(right > left || left > n || right > n) return;
        
        if(left == n && right == n){
            
            res.push_back(path);
            return;   
        }
        DFS(left + 1, right, path + '(', n, res);
        DFS(left, right + 1, path + ')', n, res);
    }
    
};

java:

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        
        DFS(0, 0, "", n, res);
        return res;
    }
    public void DFS(int left, int right, String path, int n, List<String> res){
        if(right > left || left > n || right > n) return;
        
        if(left == n && right == n){
            
            res.add(path);
            return;   
        }
        DFS(left + 1, right, path + '(', n, res);
        DFS(left, right + 1, path + ')', n, res);
    }
}

Python:

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

解法2:动态规划法
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)”)”

So 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)”)”(An iterative method.
dp[0] = “”
dp[i]=’(’+ dp[k]+’)’+dp[i-1-k],k=0…i-1(A simplified c++ DP solution, 4ms, 8 lines

c++:
内层用vector 外层可以用数组也可以继续用vector
vector初始化用(),第一个参数是数量,第二个参数是值

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector< vector<string> > dp(n + 1, vector<string>());
        //vector<string> dp[n + 1];
        dp[0].push_back("");
        for(int i = 1; i <= n; i++){
            for(int k = 0; k < i;k++){
                for(string s2: dp[i-1-k]){
                    for(string s1: dp[k]){
                        dp[i].push_back("(" + s1 + ")" + s2);
                    }
                }
            }
        }
        return dp[n];
    }
   
    
};

java:

  1. 采用数组方式实现 必须new List[n + 1]而不是ArrayList 因为Collections.singletonList和 Arrays.asList返回List
    Arrays.asList使用指南
    singletonList()方法实例
  2. 在进行add操作必须要创建实例 如List temp = new ArrayList<>();不能直接对dp[i] 进行add操作,会出现空指针异常
class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> dp[] = new List[n + 1];
        dp[0] = Collections.singletonList("");
        //dp[0] = Arrays.asList("");
        for(int i = 1; i <= n; i++){
            List<String> temp = new ArrayList<>();
            for(int k = 0; k < i;k++){
                for(String s1: dp[k]){
                    for(String s2: dp[i-1-k]){
                        temp.add("(" + s1 + ")" + s2);
                    }
                }
            }
            dp[i] = temp;
        }
        return dp[n];
        
    }
    
}

在嵌套List

class Solution {
    public List<String> generateParenthesis(int n) {
        List<List<String>>dp = new ArrayList<>();
        //dp.add(Collections.singletonList(""));
        dp.add(Arrays.asList(""));
        for(int i = 1; i <= n; i++){
            List<String> temp = new ArrayList<>();
            for(int k = 0; k < i;k++){
                for(String s1: dp.get(k)){
                    for(String s2: dp.get(i-1-k)){
                        temp.add("(" + s1 + ")" + s2);
                    }
                }
            }
            dp.add(temp);
        }
        return dp.get(dp.size() - 1);
        
    }
    
}

python:
最后dp[i] += 而不是=

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(1, n + 1):
            for k in range(i):
                dp[i] += ["(" + x + ")" + y for x in dp[k] for y in dp[i - 1 - k]]      
        
        
        return dp[n]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值