LeetCode - Generate Parentheses

本文介绍了一种使用回溯法生成所有可能的有效括号序列的方法。对于长度为2n的括号序列,通过递归地选择左括号或右括号来构造序列,并确保左括号的数量始终不小于右括号的数量,以保持序列的有效性。

生成括号串。回溯遍历。

要生成2n个括号。每次要么左括号,要么右括号。

1 左括号数<n:

        a 左括号数==右括号数,可插入左括号。

        b 左括号数>右括号数,可插入左括号或者右括号。

2 左括号数==n:

        a 左括号数==右括号数, 有效序列生成。

        b 左括号数>右括号数,插入右括号。

class Solution {
public:
    void _generate(vector<string> &res,string &to_put, int left, int right,int n){
		if(left==right && left==n){
			res.push_back(to_put);
			return;
		}
		if(left==n){
			to_put.push_back(')');
			_generate(res,to_put,left,right+1,n);
			to_put.pop_back();
            return;
		}
		if(left==right){
			to_put.push_back('(');
			_generate(res,to_put,left+1,right,n);
			to_put.pop_back();
			return;
		}
		to_put.push_back('(');
		_generate(res,to_put,left+1,right,n);
		to_put.pop_back();
		to_put.push_back(')');
		_generate(res,to_put,left,right+1,n);
		to_put.pop_back();
		return;
	}
	vector<string> generateParenthesis(int n) {
		vector<string> res;
		string to_put;
		_generate(res,to_put,0,0,n);
		return res;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值