题解 | #括号生成#

括号生成

https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca

思路:

相当于一共�n个左括号和�n个右括号,可以给我们使用,我们需要依次组装这些括号。每当我们使用一个左括号之后,就剩下�−1n−1个左括号和�n个右括号给我们使用,结果拼在使用的左括号之后就行了,因此后者就是一个子问题,可以使用递归:

  • 终止条件: 左右括号都使用了n个,将结果加入数组。
  • 返回值: 每一级向上一级返回后续组装后的字符串,即子问题中搭配出来的括号序列。
  • 本级任务: 每一级就是保证左括号还有剩余的情况下,使用一次左括号进入子问题,或者右括号还有剩余且右括号使用次数少于左括号的情况下使用一次右括号进入子问题。

但是这样递归不能保证括号一定合法,我们需要保证左括号出现的次数比右括号多时我们再使用右括号就一定能保证括号合法了,因此每次需要检查左括号和右括号的使用次数。

具体做法:

  • step 1:将空串与左右括号各自使用了0个送入递归。
  • step 2:若是左右括号都使用了�n个,此时就是一种结果。
  • step 3:若是左括号数没有到达�n个,可以考虑增加左括号,或者右括号数没有到达�n个且左括号的使用次数多于右括号就可以增加右括号。
#include <vector>
class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @return string字符串vector
     */
    void recursion(int left,int right,string temp,vector<string> &res,int n)
    {
        //左右括号都用完了,就加入结果
        if(left == n && right == n)
        {
            res.push_back(temp);
            return;
        }
        //使用一次左括号
        if(left < n)
            recursion(left+1, right, temp + '(',res, n);
        //使用一次右括号,右括号个数必须少于左括号
        if(right < n && left > right)
            recursion(left, right+1, temp+')', res, n);
    }
    vector<string> generateParenthesis(int n) {
        // write code here
        vector<string> res;//记录结果
        string temp;//记录每次组装的字符串
        //递归求结果
        recursion(0, 0, temp, res, n);
        return res;
    }
};

全部评论

相关推荐

08-11 11:16
已编辑
天津工业大学 Java
程序员牛肉:我个人觉得就是中厂吧,运气好点能进个大厂。 八月找暑期当然找不到了,现在各大厂的暑期实习一般都是三月多开放,五月多收尾。你这都八月多了肯定找不到,相当于是半夜去逛商场了。吃了信息差的亏了。 简历上的实习部分有很大的问题。你作为应聘后端的同学,实习经历中看不出来你干了哪些后端需求,一眼扫过去都是一些配置类的需求,Swagger文档就不要拿出来了。以及撰写技术文档和写单测这种经历。 所以建议你重写一下你的实习部分,重点突出需求,需求啊同学。比如详细的说一下自己是怎么使用GraalVM以及虚拟线程提高项目启动速度的。 调研了什么技术,有什么收获,有什么可以拿出来讲的技术点。
点赞 评论 收藏
分享
ResourceUt...:楼主有自己的垃圾箱,公司也有自己的人才库
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-24 11:13
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务