题目
有n组括号,生成这n组括号所有的合法的组合
对于某组括号,(())这种情况是合法的; )( 不合法
例如:n = 3;
结果:"((()))","(()())","()()()","(())()","()(())"
求解
思路
需要满足以下条件
- 左右括号()的数量不能超过n
- 每放置一个左括号(,才可以放置右括号),也就是说右括号)不可以先与左括号(放置
- 123r
递归条件
- 左括号任何时候都可以放
- 右括号个数>左括号,放右括号
定义
- 最终结果 vector<string> ret;
- 每次的临时 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;
}
};
执行结果