题解 | #括号生成#

括号生成

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

2022.0901算法第50题括号生成
这题刚开始想到使用全排列,然后通过判断得到的排列是否符合要求进行存储。
但是结果字符中的判断并不好进行,使用左右括号出现的数量作比较应该可以。
最主要的原因是超时,n对括号进行的全排列就是2n级别的,当n=8时时间就超了
之后看了解析发现这题使用的套路并没有那么明显
将n对括号分为左右两个,根据左括号和右括号的关系进行递归,没感觉有回溯
这个感觉好难想,想不明白怎样进行的了
vector<string> res;
void backtrack(int n,int left,int right,string &path){
    //left==right==n,表示先判断left==right然后将结果与n做判断,这样是不对的
    //left==n&&right==n才是正确的
    //终止条件,左括号和右括号都等于n时,满足条件
    if(left==n&&right==n){
        res.push_back(path);
        return ;
    }
    //当左括号小于n时,就可以选择左括号
    if(left<n){
        //这里的递归回溯逻辑没捋清楚,还需要再想想
        path.push_back('(');
        backtrack(n, left+1, right, path);
        path.pop_back();
    }
    //当右括号小于n并且右括号数量小于左括号数量就可以选择右括号
    if(right<n&&left>right){
        path.push_back(')');
        backtrack(n, left, right+1, path);
        path.pop_back();
    }
}
vector<string> generateParenthesis(int n) {
    string path;
    backtrack(n, 0, 0, path);
    return res;
}
这个代码不再是for循环,而是if判断
这样产生的树,应该每个节点最多只有两个分支,应该是个二叉树
不清楚为什么
backtrack(n, left, right+1, path+')');
这样也能过,这样感觉并没有进行回溯,path变量不会一直添加字符吗?
我理解的应该递归中全程使用的都是path变量
待续。。。

#算法题#
全部评论

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务