目录
题目:

题解:
-
核心方法:回溯 + 剪枝,通过深度优先遍历构建括号字符串,同时用规则过滤无效路径;
-
路径与约束:
-
路径:用
current记录当前构建的括号串; -
剪枝规则:左括号数不超
n,右括号数不超左括号数(保证有效前缀);
-
-
递归逻辑:
-
终止条件:字符串长度为
2n,将其加入结果集; -
递归选择:先尝试加左括号(满足约束时),递归探索后撤销选择;再尝试加右括号(满足约束时),递归探索后撤销选择;
-
-
主函数:初始化结果集和临时字符串,启动回溯,最终返回所有有效组合。
C++代码:
class Solution {
void backtrack(vector<string>& result , string& c , int open, int close ,int n){
if(c.size() == 2*n){
result.push_back(c);
return;
}
// 左括号未使用完
if(open < n){
c.push_back('(');
backtrack(result, c, open+1,close,n);
c.pop_back();
}
// 满足右括号小于左括号
if(close < open ){
c.push_back(')');
backtrack(result, c, open,close+1,n);
c.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
//调用我们定义的函数
vector<string> result;
string cur;
backtrack(result,cur,0,0,n);
return result;
}
};
代码细节:
这里的 ans和cur需要用引用类型才能被实际修改
vector<string>& ans 引用类型的字符串数组,存储所有有效括号字符串 string& cur 引用类型的字符串