09Leetcode---Generate parentheses

一. 题目

   n表示生成括号的对数,请写一个函数,输入n,产生所有可能且有效的括号组合 

例如 n=3  生成结果:

                [ 
                    “((()))”, 
                    “(()())”, 
                    “(())()”, 
                    “()(())”, 
                    “()()()” 

                ]

二. 思路:

       目标:求出所有由n对圆括号组合的有效形式,考虑用递归的方法生成所有可能的组合形式,关键:如何保证使用递归算法生成的组合形式是合法的

        分析:1. n对括号(包含n个left括号   n个right括号)2. 两个限制条件:(1)左右括号数相等 (2)在任意位置之前的右括号不大于左括号数;

        步骤:1. 取string str 保存生成结果, int left 为剩余要插入的左括号数, int right 为剩余要插入的右括号数

                   2. left ==0 且 right ==0 说明已生成一个由n对圆括号组合的有效形式,将其存入结果中即可

                   3. 若left!=0那么插入左括号就是合法的;若right!=0且right>left(即当前剩余需要插入的右括号树大于剩余左括号树,那么插入右括号也是合法的!)。

void generate(vector<string> &result, string str, int left, int right)
{
    if (left == 0 && right == 0)
    {
        result.push_back(str);
    }
    else
    {
        if (left != 0)
            generate(result, str + "(", left - 1, right);
        if (right > left)
            generate(result, str + ")", left, right - 1);
    }
}

C++版

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        generate(n, n, "", result);
        return result;
    }
    
    void generate(int leftNums, int rightNums, string s, vector<string>& result){
        if (leftNums == 0 && rightNums == 0) result.push_back(s);
        if (leftNums > 0){
            generate(leftNums - 1, rightNums, s + "(", result);
        }
        if (leftNums < rightNums && rightNums > 0){
            generate(leftNums, rightNums - 1, s + ")", result);
        }
    }
};

python版

class Solution:
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        self.res= []
        self.generateParenthesisIter('',n,n)
        return self.res
    def generateParenthesisIter(self,mstr,r,l):
        if r==0 and l==0:
            self.res.append(mstr)
            #如果左括号的个数还有剩余,则+’(‘然后递归
        if l>0:
            self.generateParenthesisIter(mstr+'(',r,l-1)
            #如果右括号有剩余且小于左括号的个数则+‘)’
        if r>0 and r>l:
            self.generateParenthesisIter(mstr+')',r-1,l)

三. reference

             c++ 思路         https://blog.csdn.net/alexlau8/article/details/72803010?locationNum=7&fps=1

          python code        https://blog.csdn.net/qq_36791003/article/details/81317740 

猜你喜欢

转载自blog.csdn.net/qinghange/article/details/82960128