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:

"((()))", "(()())", "(())()", "()(())", "()()()"



    【分析】

    显然是个遍历的过程,但是如何遍历是个问题。遍历,我们经常可以使用递归的方式解决。递归,套路是先写出跳出条件,然后再写其他递归调用程序部分。这个题目中跳出条件明显是当左括号(和右括号)都使用完的时候,压入结果,返回。那么剩下的部分呢?这个时候就要结合具体问题,具体分析了。括号匹配最核心的是,生成的括号一定要是well-formed。这就需要当前生成的cur字符串中,一定要保证左括号的数量小于右括号数量。所以,如果左括号数量m不等于0,则可以继续放置,而当左括号数量小于右括号数量,并且右括号数量不等于0的时候,才可以放置右括号!



    【代码】

    运行时间:5ms


class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        if(n == 0)
            return res;
            
        string cur = "";
        fun(res, cur, n, n);
        
        return res;
    }
    
    void fun(vector<string>& res, string cur, int m, int n)
    {
        if(m == 0 && n == 0)
        {
            res.push_back(cur);
            return;
        }
        
        if(m != 0)
        {
            fun(res, cur + '(', m-1, n);
        }
        if(m < n && n != 0)  // "m < n" ensure the generated parantheses are well-formed
        {
            fun(res, cur + ')', m, n-1);
        }
        
    }
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值