随笔 - 112  文章 - 0  评论 - 0  阅读 - 1426

括号生成(回溯)

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

 

示例 1:

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

示例 2:

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

 

复制代码
class Solution {
public:
    // 存储所有可能的有效括号组合的结果集
    vector<string> res;
    // 临时字符串,用于构建当前递归路径下的括号组合
    string s;

    // 回溯函数,用于生成所有有效括号的组合
    // left: 当前已经使用的左括号 '(' 的数量
    // right: 当前已经使用的右括号 ')' 的数量
    // n: 每种括号对的数量,即最终结果中每种括号出现的次数
    void backtrack(int left, int right, int n) {
        // 如果当前构建的字符串长度达到了2*n,说明一组有效括号组合已完成
        if (s.size() == 2 * n) {
            // 将当前构建好的有效括号组合加入到结果集中
            res.push_back(s);
            return;
        }

        // 如果左括号的数量还没有达到n,则可以放置一个左括号
        if (left < n) {
            s.push_back('('); // 放置左括号
            backtrack(left + 1, right, n); // 继续递归构建剩余部分
            s.pop_back(); // 回溯:撤销上一步的选择,尝试其他可能性
        }

        // 如果右括号的数量小于左括号的数量,则可以放置一个右括号
        if (right < left) {
            s.push_back(')'); // 放置右括号
            backtrack(left, right + 1, n); // 继续递归构建剩余部分
            s.pop_back(); // 回溯:撤销上一步的选择,尝试其他可能性
        }
    }

    // 主函数,返回所有组合的、有效的括号序列
    // n: 每种括号对的数量
    vector<string> generateParenthesis(int n) {
        // 调用回溯函数开始搜索
        backtrack(0, 0, n);
        // 返回最终找到的所有有效括号组合
        return res;
    }
};
复制代码

 

posted on   _月生  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示