题目描述
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:"((()))", "(()())", "(())()", "()()()", "()(())"
数据范围:0≤n≤10
要求:空间复杂度 O(n),时间复杂度 O(2^n)
核心代码
void recursion(int left,int right,int n,string temp,vector<string>& res)
{
if(left==n&&right==n){
res.push_back(temp);
return;
}
if(left<n) recursion(left+1, right, n, temp+"(", res);
if(right<left) recursion(left, right+1, n, temp+")", res);
}
vector<string> generateParenthesis(int n) {
vector<string> res;
recursion(0, 0, n, "", res);
return res;
}
可以借鉴括号栈的思想,只要每次加入右括号时仍有未配对的左括号,该括号序列一定合法。针对当前合法序列temp,其中左括号数量一定大于右括号。如果仍有未使用的左括号,在temp后添加左括号可保证合法。如果右括号数量少于左括号,在temp后添加右括号一定合法。可根据此思路设计递归。