题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:
输入:n = 1 输出:["()"]
分析
为了生成所有可能的并且有效的括号组合,可以使用回溯算法。回溯算法通过递归的方式,尝试所有可能的括号组合,并在生成过程中确保组合的有效性。
回溯法
代码解释
回溯函数 backtrack
:
open
:当前已经使用的左括号的数量。
close
:当前已经使用的右括号的数量。
max
:括号的对数。
当 current
的长度达到 2 * max
时,说明已经生成了一个完整的括号组合,将其添加到 result
中。
如果 open
小于 max
,可以添加一个左括号,并递归调用 backtrack
。
如果 close
小于 open
,可以添加一个右括号,并递归调用 backtrack
。
时间复杂度:O()
空间复杂度:O()
class Solution {
private:
// 回溯函数,用于生成括号组合
void backtrack(std::vector<std::string>& result, std::string current, int open, int close, int max) {
// 当当前组合的长度达到 2 * max 时,说明已经生成了一个完整的括号组合
if (current.length() == max * 2) {
result.push_back(current);
return;
}
// 如果左括号的数量小于 max,则可以添加一个左括号
if (open < max) {
backtrack(result, current + '(', open + 1, close, max);
}
// 如果右括号的数量小于左括号的数量,则可以添加一个右括号
if (close < open) {
backtrack(result, current + ')', open, close + 1, max);
}
}
public:
std::vector<std::string> generateParenthesis(int n) {
std::vector<std::string> result;
backtrack(result, "", 0, 0, n);
return result;
}
};