回溯算法求解,括号对数组合问题

给出 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章