题目描述:
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
题目链接:
. - 力扣(LeetCode)
解题主要思路:
理清楚什么时候可以加 '(',什么时候可以加 ')'即可。
什么时候可以加 '(' ?当左括号的数量小于题目要求n的时,就可以➕左括号;
当右括号的数量小于左括号时,就可以➕右括号;
当右括号的数量==题目要求n时,说明无需再往下递归,将path结果插入到ret中即可。
解题代码:
class Solution {
public:
int left, right, n;
vector<string> ret;
string path;
vector<string> generateParenthesis(int _n) {
n = _n;
dfs();
return ret;
}
void dfs()
{
if (right == n) {
ret.push_back(path);
return;
}
if (left < n) { // 添加左括号
path.push_back('('); ++left;
dfs();
path.pop_back(); --left;
}
if (right < left) { // 添加右括号
path.push_back(')'); ++right;
dfs();
path.pop_back(); --right;
}
}
};