22. Generate Parentheses(生成括号)
题目大意
Given n
pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
中文释义
给定 n
对括号,编写一个函数来生成所有格式正确的括号组合。
示例
- 示例 1:
- 输入:
n = 3
- 输出:
["((()))","(()())","(())()","()(())","()()()"]
- 输入:
- 示例 2:
- 输入:
n = 1
- 输出:
["()"]
- 输入:
限制条件
1 <= n <= 8
解题思路
使用回溯法生成所有可能的括号组合。维护两个计数器,分别记录已放置的左括号和右括号的数量,以确保每次添加的括号都是有效的。
步骤说明
- 当当前字符串长度等于
n * 2
时,将其加入结果中。 - 如果左括号数量小于
n
,则添加一个左括号,并递归调用。 - 如果右括号数量小于左括号数量,添加一个右括号,并递归调用。
- 回溯:在递归返回后,删除最后一个字符,以便尝试其他组合。
代码
class Solution {
public:
void backtrack(vector<string>& result, string& current, int open, int close, int n) {
// 当前字符串长度达到 n * 2
if (current.length() == n * 2) {
result.push_back(current);
return;
}
// 添加左括号
if (open < n) {
current.push_back('(');
backtrack(result, current, open + 1, close, n);
current.pop_back();
}
// 添加右括号
if (close < open) {
current.push_back(')');
backtrack(result, current, open, close + 1, n);
current.pop_back();
}
}
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}
};