括号生成(回溯)

数字 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 2024-12-31 22:39  _月生  阅读(24)  评论(0)    收藏  举报