LeetCode OJ-- Generate Parentheses *

https://oj.leetcode.com/problems/generate-parentheses/

输入n产生n个( ,n个 )组成的所有合法的括号组合。

现在纸上画画,找到规律:

1.每一个位置上 ( 的个数必须 >= ) 的个数

2.如果 ( 的个数是n了,则只能再画 ) 了

3.否则,既可以是 ( 又可以是 )

4.初始第一个位置是 (

5.当 string的长度是 2*n 的时候停止

使用递归调用:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        if(n<=0)
            return ans;

        string ansPiece;
        ansPiece.append("(");

        subGenerateParenthesis(n,ans,ansPiece);

        return ans;
    }
    void subGenerateParenthesis(int &n, vector<string> &ans, string ansPiece)
    {
        if(ansPiece.size() == 2*n)
        {
            ans.push_back(ansPiece);
            return;
        }
        int leftNum = 0;
        int rightNum = 0;
        for(int i = 0;i<ansPiece.size();i++)
        {
            if(ansPiece[i]=='(')
                leftNum++;
            else
                rightNum++;
        }
        if(leftNum==n )
        {
            ansPiece.push_back(')');
            subGenerateParenthesis(n,ans,ansPiece);
        }
        else if(leftNum == rightNum)
        {
            ansPiece.push_back('(');
            subGenerateParenthesis(n,ans,ansPiece);
        }
        else
        {
            string ansPiece2 = ansPiece;
            ansPiece.push_back('(');
            subGenerateParenthesis(n,ans,ansPiece);

            ansPiece2.push_back(')');
            subGenerateParenthesis(n,ans,ansPiece2);
        }
    }
};
原文地址:https://www.cnblogs.com/qingcheng/p/3817319.html