二刷LeetCode--22. 括号生成(C++版本)回溯法例题

本题思路主要还是几种回溯法的使用,可以想象为二叉树,一直向左子树加入左括号,当加入的左括号到达最大限制,就回退到上一层,然后自然需要向右子树加入右括号,然后依次递归,还是需要注意递归的终止条件,在左右括号都达到最大的时候则需要将本次的结果存在最终的字符串数组中,本题相关报错

// class Solution {
// public:
//     vector<string> generateParenthesis(int n) {
//         vector<string> res;
//         string path;
//         dfs(path,0 ,0, n, res);
//         return res;
//     }

//     void dfs(string path,int left, int right, int n, vector<string> &res)
//     {
//         if(left == n && right == n)
//             {
//                 res.push_back(path);
//                 return ;
//             }
//         // 左子树的深度就是[0, n)
//         if(left < n)
//         {
//             // 左子树加左括号
//             path += "(";
//             // 向下一层,继续递归直到走到对应深度
//             dfs(path, left + 1, right, n, res);
//             // 返回上一层
//             path.pop_back();
//         }
//         // 当右子树的深度小于左子树的时候就可以继续增加
//         if(right < left)
//         {
//             path += ")";
//             // 右子树同样向下增加一层然后通过递归来添加右括号
//             dfs(path, left, right + 1, n, res);
//             // path.pop_back();
//         }
//     }
// };



// class Solution {
// public:
//     vector<string> generateParenthesis(int n) {
//         vector<string> res;
//         int lc = 0, rc = 0;
//         dfs(res, "", n, lc, rc);
//         return res;
//     }
//     void dfs(vector<string>& res, string path, int n, int lc, int rc) {
//         if (rc > lc || lc > n || rc > n) return;
//         if (lc == rc && lc == n) {
//             res.push_back(path);
//             return;
//         }
//         dfs(res, path + '(', n, lc + 1, rc);
//         dfs(res, path + ')', n, lc, rc + 1);
//     }
// };

class Solution {
public:
    vector<string> res;
    vector<string> generateParenthesis(int n) {
        dfs("", n, n);
        return res;
    }
    // 这里必须是const否则报错
    void dfs(const string& tmp, int left, int right)
    // void dfs(string& tmp, int left, int right) 
    {
        if(left < 0 || left > right)
            return ;
        if(left == 0 && right == 0)
        {
            res.push_back(tmp);
            return ;
        }
        dfs(tmp + '(', left - 1, right);
        dfs(tmp + ')', left, right - 1);
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值