首页 > 技术文章 > 【LeetCode】22. Generate Parentheses (2 solutions)

ganganloveu 2014-12-20 11:01 原文

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 ++;
                }
            }
        }
    }
};

推荐阅读