题解 | 括号生成:回溯
括号生成
https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca
思路
- 维护当前构建的字符串 cur。
- 用两个计数器:left(已使用的左括号数)、right(已使用的右括号数)。
- 递归条件:当 left == n 且 right == n 时,当前字符串是一个有效组合,加入结果。
- 如果 left < n,可以继续添加 '('(左括号随时可以加,只要不超过 n)。
- 如果 right < left,可以继续添加 ')'(右括号只有在已使用的左括号更多时才能加,以保证匹配)。
- 使用 push_back 和 pop_back 实现回溯,避免字符串拷贝。
- 先尝试添加左括号,再尝试添加右括号
#include <functional>
#include <string>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串vector
*/
vector<string> generateParenthesis(int n) {
// write code here
vector<string> res;
string cur;
function<void(int, int)>dfs = [&]( int left, int right) {
if (left == n && right == n) {
res.push_back(cur);
return;
}
if (left < n) {
cur.push_back('(');//做出选择(添加/标记);
dfs(left + 1, right);//递归深入
cur.pop_back();//撤销选择(回溯/移除/取消标记);
}
if (right < left) {
cur.push_back(')');
dfs(left, right + 1);
cur.pop_back();
}
};
dfs(0, 0);
return res;
}
};


