题解 | 括号生成:回溯

括号生成

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

思路

  • 维护当前构建的字符串 cur。
  • 用两个计数器:left(已使用的左括号数)、right(已使用的右括号数)。
  • 递归条件:当 left == n 且 right == n 时,当前字符串是一个有效组合,加入结果。
  • 如果 left < n,可以继续添加 '('(左括号随时可以加,只要不超过 n)。
  • 如果 right < left,可以继续添加 ')'(右括号只有在已使用的左括号更多时才能加,以保证匹配)。
  • 使用 push_back 和 pop_back 实现回溯,避免字符串拷贝。
  • 先尝试添加左括号,再尝试添加右括号

#include <functional>
#include <string>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串vector
     */
    vector<string> generateParenthesis(int n) {
        // write code here
        vector<string> res;
        string cur;

        function<void(int, int)>dfs = [&]( int left, int right) {
            if (left == n && right == n) {
                res.push_back(cur);
                return;
            }
            if (left < n) {
                cur.push_back('(');//做出选择(添加/标记);
                dfs(left + 1, right);//递归深入
                cur.pop_back();//撤销选择(回溯/移除/取消标记);
            }
            if (right < left) {
                cur.push_back(')');
                dfs(left, right + 1);
                cur.pop_back();
            }
        };
        dfs(0, 0);
        return res;
    }
};
全部评论

相关推荐

03-08 18:11
门头沟学院 Java
想要实习的牛:这么牛逼的简历都吃瘪吗🌚那我不寄了
点赞 评论 收藏
分享
KKorz:是这样的,还会定期默写抽查
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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