leetcode 22.括号生成
题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
回溯法
宇宙无敌回溯法,回溯法用于求解一类问题,该类问题我们不知道明确的计算法则,需要不断的试探,去寻找答案,如果不满足问题的要求,就返回到上一个状态继续尝试。
回溯法的步骤个人总结分三步:
- 递归出口
- 路径选择,递归操作
- 状态重置
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
if(n<0){
return res;
}
string track = "";
backTrack(res, track, n, n);
return res;
}
// 递归函数
void backTrack(vector<string>& res, string track, int l, int r){
// 当左括号和右括号的数量都减少为零时,结束递归
if(l==0 && r==0){
res.push_back(track);
return ;
}
else if(l==0 && r>0){ // 当左括号数量减少为零时,通过递归取减少右括号的数量
track.push_back(')');
backTrack(res, track, l, r-1);
return;
}
else if(l == r){ // 当左右括号的数量相等时,只能选择左括号,否则是无效的组合
track.push_back('(');
backTrack(res, track, l-1, r);
}
else if(l<r){ // 当左括号数量小于右括号的数量的时候,左右括号都可以被选择
for(int i=0; i<2; i++){
if(i==0){
track.push_back('(');
backTrack(res, track, l-1, r);
track.pop_back(); // 重置状态
}
else{
track.push_back(')');
backTrack(res, track, l, r-1);
track.pop_back(); // 重置状态
}
}
}
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步