题解 | #括号生成#

括号生成

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变量
待续。。。

#算法题#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务