LeetCode hot 100—括号生成
题目
数字 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;}
};