[LeetCode]22. Generate Parentheses

题目:Given n pairs of parentheses, write a function to 
generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
一般来说是用递归的方法,因为可以归结为子问题去操作.
在每次递归函数中记录左括号和右括号的剩余数量,
然后有两种选择,一个是放一个左括号,另一种是放一个右括号。
需要特别注意的是剩余的右括号不能比左括号少,左括号右括号数量都要大于0。

如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。

关于卡特兰数,请参见卡特兰数-维基百科

两种方法如下:

class Solution {
public:
	vector<string> generateParenthesis(int n) {
		vector<string> res;
		addingpar(res, "", n, 0);
		return res;
	}
	void addingpar(vector<string> &v, string str, int n, int m){
		if (n == 0 && m == 0) {
			v.push_back(str);
			return;
		}
		if (m > 0){ addingpar(v, str + ")", n, m - 1); }
		if (n > 0){ addingpar(v, str + "(", n - 1, m + 1); }
	}
};

class Solution {
public:
	vector<string> generateParenthesis(int n) {
		if (n == 0)
			return vector<string>();
		vector<string > ret;
		dfs(ret, "", n, n);
		return ret;
	}

	//利用二叉树递归思想
	void dfs(vector<string> &ret, string tmp, int left, int right)
	{
		if (0 == left && 0 == right)
		{
			ret.push_back(tmp);
			return;
		}
		else if (left > 0)
			dfs(ret, tmp + '(', left - 1, right);
		if (left < right)
			dfs(ret, tmp + ')', left, right - 1);
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值