题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题目链接: https://leetcode-cn.com/problems/generate-parentheses/
思路
使用递归+回溯来做。递归中先放左括号'(',当右括号')'的个数小于左括号的个数时才能放右括号。代码如下:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
if(n<1){
return ans;
}
int left = 0, right = 0; // 当前左括号、右括号的个数
generate(ans, "", left, right, n);
return ans;
}
void generate(vector<string>& ans, string curStr, int left, int right, int n){
if(curStr.length()==n*2){
ans.push_back(curStr);
return;
}
if(left<n){
curStr += "(";
generate(ans, curStr, left+1, right, n);
curStr.pop_back(); // 将字符串最后一位删掉
}
if(right<left){ // 注意这个条件
curStr += ")";
generate(ans, curStr, left, right+1, n);
curStr.pop_back(); //将字符串最后一位删掉
}
}
};
- 时间复杂度:(O(frac{4^n}{sqrt{n}}))
- 空间复杂度:O(n)
每一层递归需要O(1)的空间复杂度,最多递归2n层,所以空间复杂度为O(n)。