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); } } };
|
使用递归+回溯来解决。
该题主要是要找放括号的时机。
首先要先放左括号。
第二,只要放左括号的个数比右括号多,就可以放右括号。