给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里我们利用回溯法进行求解:
由两个前提可写出如下代码,从空串中逐步递归添加左右括号,
1.如果右括号比左括号多,说明无效则返回
2.如果左括号数量超过N,则与题意不符,返回
3.如果左右括号都达到了指定数量,则可以将其添加到数组中保存
4.如果以上条件都没有满足,则尝试加入新的左括号和右括号
回溯的思想体现在两个递归调用上,作为递归的参数“l”,在网下递归的过程中,如果有不满足条件的情况,会不断回溯(return)到条件开始的位置,再变换“r”往下执行,思想很巧妙。
void dfs(vector<string> &res, int l, int r, int n, string tmp)
{
if(l>n)
return;
if(r>l)
return;
if(r==l&&l==n)
res.push_back(tmp);
dfs(res, l+1, r, n, tmp+'('); //两重递归实现回溯思法
dfs(res, l, r+1, n, tmp+')'); //
}
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
string tmp="";
dfs(res,0,0,n,tmp);
return res;
}
};