leetcode 括号生成

描述

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

分析:

回溯法

递归

每次填入的要么是(要么是),当然,第一个肯定是(,并且)的数目不会超过(;记录左括号和右括号的数量,当分别达到n时即为合格的状态,可以压入vector,当然为了去重最好先用set然后转为vector

代码:

在递归时传入的参数非常重要,发现left+=1和left+1这样的传入得到的结果是不一样的

class Solution {
public:
   vector ans;
setsetans;
void backWay(string cur, int left, int right, int n)
{
	if (left ==n&& right ==n)
	{
		setans.insert(cur);
	return; }

	if (left < n)
	{
		
		backWay( cur+"(", left+1 , right, n);

	}
	if(right < left)
	{
		//cur = cur + ")";
		//right += 1;
		backWay( cur+")", left, right+1, n);
	}
}
vector generateParenthesis(int n) {
	setans.clear();
	ans.clear();
	backWay("", 0, 0, n);
	set::iterator it;
	for (it = setans.begin(); it != setans.end(); it++)
	{
		ans.push_back(*it);
	}
	return ans;
}
};

 

你可能感兴趣的:(算法,程序设计竞赛)