22. 括号生成

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

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

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
putone("",n,n,result);
return result;
}
void putone(string item, int left, int right, vector<string> &result){
if(left == 0 && right == 0){
result.push_back(item);
return;
}
//只要left还能放。
if(left > 0){
putone(item+ "(",left-1,right,result);
}
//left放的比right多,
if(left < right){
putone(item+ ")",left,right-1,result);
}
}
};

使用递归+回溯来解决。

该题主要是要找放括号的时机。

首先要先放左括号。

第二,只要放左括号的个数比右括号多,就可以放右括号。