一、运行结果
二、题目
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
"((()))", "(()())", "(())()", "()()()", "()(())"
数据范围:1≤n≤8
三、思路
题目要求的是所有由n个左括号和n个右括号组成的有效括号对序列,所谓有效括号对序列,归结起来只有一个要求:从括号串的起始位置到括号串的任意一个位置,右括号的数量不能超过左括号的数量,最终用完n个左括号和n个右括号,这里采用递归的思路求解。具体考虑如下:
1)若n个左括号没有用完,则可以考虑添加一个左括号;
2)若n个右括号没有用完,并且当前生成的串中左括号的数量大于右括号的数量,则可以考虑添加右括号;
若左括号和右括号都已经使用了n个,则当前括号串就是一个有效的括号对序列,将其加入到结果数组中。
四、代码
class Solution {
public:
//l和r分别是已经tmp中已经使用的左括号和右括号个数
void recursion(int l, int r, string tmp, vector<string> &res, int n){
if(l == n && r == n){
res.emplace_back(tmp);
return;
}
if(l < n) //左括号未用完,考虑添加左括号
recursion(l+1, r, tmp+'(', res, n);
if(r < n && l > r) //右括号用的比左括号少,考虑添加右括号
recursion(l, r+1, tmp+')', res, n);
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
string tmp = "";
recursion(0, 0,tmp, ans, n);
return ans;
}