【LeetCode】22. Generate Parentheses (2 solutions)

本文介绍了一种生成合法括号组合的算法,通过两种递归方法实现。第一种使用栈来跟踪括号匹配情况,第二种则通过计数来简化流程。

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:

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

 

解法一:递归

借助栈,'('、')'构成一对分别进出栈。最后栈为空,则输入括号构成的字符串是合法的。

注意:调用top()前先check一下栈是否为空

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        if(n == 0)
            return result;
        //first must be '('
        string cur = "(";
        stack<char> s;
        s.push('(');
        
        Helper(result, cur, s, 2*n-1);
        return result;
    }
    void Helper(vector<string>& result, string cur, stack<char> s, int num)
    {
        if(num == 1)
        {//must be ')'
            if(s.top() == '(' && s.size() == 1)
            {//all matched
                cur += ')';
                result.push_back(cur);
            }
        }
        else
        {
            //'(' always push
            string str1 = cur;
            str1 += '(';
            s.push('(');
            Helper(result, str1, s, num-1);
            s.pop();
            
            //')'
            if(!s.empty())
            {//prune. never begin with ')'
                string str2 = cur;
                str2 += ')';
                if(s.top() == '(')
                    s.pop();    //check empty() before access top()
                else
                    s.push(')');
                Helper(result, str2, s, num-1);
            }
        }
    }
};

 

解法二:递归

稍作分析可知,栈是不必要的,只要记录字符串中有几个'(',记为count。

每进入一个'(', count ++. 每匹配一对括号, count--。

最终全部匹配,需要count==0

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ret;
        string cur = "(";
        gen(ret, cur, 2*n-1, 1);
        return ret;
    }
    void gen(vector<string>& ret, string cur, int k, int count)
    {
        if(k == 1)
        {//last paretheses
            if(count == 1)
            {//one unmatched '('
                cur += ')';
                ret.push_back(cur);
            }
        }
        else
        {
            if(count >= 0)
            {//either '(' or ')' 
                //'('
                count ++;
                if(count <= k-1)
                {//otherwise, all ')'s are still not enough
                    cur += '(';
                    gen(ret, cur, k-1, count);
                    cur.erase(cur.end()-1);
                }
                count --;
                
                //')'
                if(count > 0)
                {
                    count --;
                    cur += ')';
                    gen(ret, cur, k-1, count);
                    cur.erase(cur.end()-1);
                    count ++;
                }
            }
        }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值