09Leetcode---Generate parentheses

本文介绍了一种生成所有可能的有效括号组合的算法,通过递归方式确保括号匹配正确,提供了C++和Python两种语言实现,适用于解决LeetCode等编程挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 题目

   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.youkuaiyun.com/alexlau8/article/details/72803010?locationNum=7&fps=1

          python code        https://blog.youkuaiyun.com/qq_36791003/article/details/81317740 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值