递归 | 力扣22 括号生成 用C++实现对括号的组合

17 篇文章 0 订阅
12 篇文章 0 订阅

题目

有n组括号,生成这n组括号所有的合法的组合

对于某组括号,(())这种情况是合法的;  )( 不合法
  例如:n = 3;
  结果:"((()))","(()())","()()()","(())()","()(())"

求解

思路

需要满足以下条件

  1. 左右括号()的数量不能超过n
  2. 每放置一个左括号(,才可以放置右括号),也就是说右括号)不可以先与左括号(放置
  3. 123r

递归条件

  1. 左括号任何时候都可以放
  2. 右括号个数>左括号,放右括号

定义

  1. 最终结果  vector<string> ret;
  2. 每次的临时 string  

代码

#include<string>
#include<iostream>
#include<stdlib.h>
#include<vector.h>

void fn(string temp, int left, int right, vector<string>& ret)
{
	if (left == 0 && right == 0)//此时左右括号放置完毕,将temp的结果一次性放在ret内
	{
		ret.push_back(temp);
		return;
	}
	if (left > 0)//left是待放置的左括号
		fn(temp + '(', left - 1, right, ret);
	if (left < right)//左括号小于右括号
		fn(temp + ')', left, right - 1, ret);
}
void main()
{
	vector<string> ret;
	int n = 3;
	fn("", n, n, ret);
	for (int i = 0; i < ret.size(); i++)
		cout << ret[i] << endl;
	
}

编译结果

力扣

代码

class Solution {
public:
    //string temp;
    //vector<string>ret;
    void fun(int leftn,int rightn,vector<string>&ret,string temp)//左个数 右个数 //&
    {
        if(leftn==0&&rightn==0)
        {
            ret.push_back(temp);
            return ;
        }
        if(leftn>0)
        {
            fun(leftn-1,rightn,ret,temp+'(');
        }
        if(leftn<rightn)
        {
            fun(leftn,rightn-1,ret,temp+')');
        }
    }
    vector<string> generateParenthesis(int n) {
        vector<string>ret;
        string temp;
        fun(n,n,ret,"");// fun(n,n,ret,temp);
        return ret;
    }
};

执行结果 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值