一、题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
二、思路
一开始没啥头绪,仔细观察想起来括号是一一对应的,直接就经典回溯解决了
先优先选择加入左括号,然后再加入右括号
然后回溯至最后一个左括号,pop左,加右括号,再加左,再加右
之后回溯至倒数第二个左,pop左......
在之前的两题回溯的练习后这题做的意外挺快的,20来分钟就解决了
三、代码
class Solution {
private:
vector<string> ans;
public:
void back(string res,int left,int right){
if(left==0&&right==0){ //递归出口
ans.push_back(res);
return;
}
if(left>right) return; //如果左括号少于右括号直接剪枝,例如"(()))"
if(left>0){
res.push_back('('); //经典的回溯,先选择后撤销
back(res,left-1,right);
res.pop_back();
}
if(right>0){
res.push_back(')');
back(res,left,right-1);
res.pop_back();
}
return;
}
vector<string> generateParenthesis(int n) {
string res;
back(res,n,n);
return ans;
}
};
763

被折叠的 条评论
为什么被折叠?



