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

  • 相关阅读:
    剑指Offer-合并两个排序的链表
    1. Two Sum&&15. 3Sum&&18. 4Sum
    Sumo生成数据
    357. Count Numbers with Unique Digits
    553. Optimal Division
    147. Insertion Sort List
    24. Swap Nodes in Pairs
    【LeetCode & 剑指offer刷题】发散思维题3:62 圆圈中最后剩下的数字(约瑟夫环问题)
    【LeetCode & 剑指offer刷题】发散思维题2:43 n个骰子的点数
    【LeetCode & 剑指offer刷题】发散思维题1:17 打印从1到最大的n位数
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4175159.html
Copyright © 2020-2023  润新知