leetcode 22.括号生成

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();     // 重置状态
                }
            }
        }
    }

};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

发布了135 篇原创文章 · 获赞 164 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/103548305
今日推荐