题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8
来源:力扣(LeetCode)
算法思路和分析
简单的搜索题目,采用深度优先搜索。本题要求在解空间中寻找所有可行解,每个位置有两种取法 ‘(’ 或 ‘)’ ,注意两个限制条件:1.左括号不小于右括号数;2.左括号数不大于n。结束递归条件为左括号和右括号数量都为n,找到可行解。
时间复杂度O(2^n)。
代码实现
class Solution {
private:
vector<string> ans;
public:
void generate(string s,int n, int leftnum, int rightnum){
if(leftnum == n && rightnum == n){
ans.push_back(s);
return;
}
if(leftnum<n){
generate(s+'(',n,leftnum+1,rightnum);
}
if(leftnum>rightnum){
generate(s+')',n,leftnum,rightnum+1);
}
return;
}
vector<string> generateParenthesis(int n) {
string s = "";
generate(s,n,0,0);
return ans;
}
};