22. 括号生成

题目描述:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:

输入:n = 1
输出:["()"]
 

提示:

1 <= n <= 8


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

排列组合就用回溯,括号序列tempres总共长为2*n, 在此之前,每一位均有两种选择:左括号或者右括号。选择左括号走下去,直到tempres长度为2*n,然后判断tempres是否为合法的括号序列,是则加入res,不是则舍弃。然后从括号序列中删除左括号,替换成右括号,继续走下去,再次判断是否满足条件。

可以优化的一点是:记录括号序列tempres中的左括号数量leftsum和右括号数量rightsum,如果左括号数量leftsum>n,说明该序列不合法,直接剪枝,返回即可。右括号数量rightsum>n时同理。

详细解答请看题解:

https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode-solution/

代码如下:

class Solution {
public:
    // 括号的种类
    char kuohao[2]={'(',')'};
    vector generateParenthesis(int n) {
        // res为最终返回的结果
        vector res;
        f(res,n,"",0,0);
        return res;
    }
    // 递归函数,是用回溯 其中 tempres为生成的括号序列,leftsum为tempres中左括号的数量,rightsum为右括号的数量
    void f(vector &res,int n,string tempres,int leftsum,int rightsum)
    {
        // 如果左括号或者右括号的数量>n,说明该序列无效,直接终止
        if(leftsum>n||rightsum>n) return;
        // 如果括号序列tempres长度为2*n,说明已经全部生成完毕
        if(tempres.size()==2*n)
        {
            // 判断tempres是否为合法的括号序列,合法就入res,否则舍弃
            if(judge(tempres))
            res.push_back(tempres);
            return ;
        }
        // 依次添加左括号和右括号
        for(int i=0;i<2;i++)
        {
            // 为tempres添加一个括号
            char c=kuohao[i];
            tempres+=c;
            // 根据添加的是左括号还是右括号,来修改leftsum或者rightsum
            if(i==0) leftsum++;
            else rightsum++;
            // 递归调用,添加下一个
            f(res,n,tempres,leftsum,rightsum);
            // 回溯,删除刚才添加的括号
            tempres.erase(tempres.end()-1);
            // 根据删除的是左括号还是右括号,来修改leftsum或者rightsum
            if(i==0) leftsum--;
            else rightsum--;
        }
        return;
    }
    // 判断tempres是否为合法序列
    bool judge(string tempres)
    {
        // 栈s用来存储左括号
        stack s;
        for(int i=0;i

 

你可能感兴趣的:(leetcode,leetcode,算法,c++)