18 - generate parentheses

本文介绍了一个使用深度优先搜索(DFS)算法生成所有有效括号组合的方法。针对输入的整数n,该算法能够生成所有可能的有效括号组合。示例中展示了当n等于3时的有效括号组合。

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"


solutions: dfs,解这道题的时候leetcode不停报错internal error...晚点再测试

class Solution {
public:
    void generateResult(int left, int right, string result, vector<string> &res)
    {
        if(left == 0 && right == 0)
            res.push_back(result);
        
        if(left > 0)
            generateResult(left-1, right, result + "(", res);
        
        if(left < right)
            generateResult(left, right-1, result + ")", res);
            
    }

    vector<string> generateParenthesis(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<string> res();
        if(n <= 0)
            return res;
        
        string result = "";
        
        generateResult(n, n, result, res);
        
        return res;
    }
};



<think> 我们使用动态规划的思路来解决括号生成问题。根据引用[1]和引用[2]中的思路,我们可以将问题分解为子问题。 动态规划的思路是:对于i对括号的组合,我们可以将其表示为"(a)b"的形式,其中a是j对括号的组合,b是i-j-1对括号的组合,j的范围是0到i-1。 具体步骤: 1. 定义dp为一个数组,其中dp[i]表示i对括号的所有合法组合的集合(一个字符串向量)。 2. 初始化:dp[0] = {""}(空字符串),dp[1] = {"()"}。 3. 对于i从2到n(包含n): 对于j从0到i-1: 对于dp[j]中的每一个组合p,以及dp[i-j-1]中的每一个组合q: 构造一个字符串str = "(" + p + ")" + q,并将其加入到dp[i]中。 4. 返回dp[n]。 注意:n的范围是1到8,所以我们可以使用动态规划来解决。 我们将按照这个思路编写C++代码。 注意:在C++中,我们使用vector<vector<string>>来存储dp数组,其中dp[i]是一个字符串向量。 代码实现: </think> ### 动态规划实现括号生成 以下是使用动态规划思路实现的 C++ 代码,用于生成 n 对括号的所有合法组合(1 ≤ n ≤ 8): ```cpp #include <vector> #include <string> using namespace std; class Solution { public: vector<string> generateParenthesis(int n) { // 创建动态规划数组,dp[i] 存储 i 对括号的所有合法组合 vector<vector<string>> dp(n + 1); // 基础情况初始化 dp[0] = { "" }; // 0 对括号:空字符串 if (n >= 1) dp[1] = { "()" }; // 1 对括号:只有一种组合 // 动态规划填表(自底向上) for (int i = 2; i <= n; i++) { // i 表示当前括号对数 for (int j = 0; j < i; j++) { // j 表示内部括号对数 for (const string& p : dp[j]) { // 内部组合 p for (const string& q : dp[i - j - 1]) { // 外部组合 q // 构造新组合:"(内部组合)外部组合" dp[i].push_back("(" + p + ")" + q); } } } } return dp[n]; } }; ``` ### 算法解析 1. **问题分解**: - 任何有效的括号组合可表示为:`(A)B` - 其中 `A` 是 `j` 对括号的合法组合 - `B` 是 `i-j-1` 对括号的合法组合 - `j` 的范围为 `0 ≤ j < i` 2. **动态规划表**: - `dp[i]` 存储 `i` 对括号的所有合法组合 - 状态转移方程: $$dp[i] = \bigcup_{j=0}^{i-1} \left\{ "(" + dp[j] + ")" + dp[i-j-1] \right\}$$ 3. **时间复杂度**: - 对于每个 `i`,需要遍历 `j` 和组合对 - 总时间复杂度为 $O(\text{卡塔兰数} \times n^2)$ - 当 n=8 时,组合数为 1430,效率可接受 4. **空间复杂度**: - 使用二维数组存储所有组合 - 空间复杂度 $O(n \times \text{卡塔兰数})$ ### 测试示例 ```cpp // 测试代码示例 #include <iostream> int main() { Solution sol; for (int n = 1; n <= 3; n++) { cout << "n = " << n << ": "; for (const auto& s : sol.generateParenthesis(n)) { cout << s << " "; } cout << endl; } return 0; } ``` 输出: ``` n = 1: () n = 2: (()) ()() n = 3: ((())) (()()) (())() ()(()) ()()() ``` ### 算法优势 1. **避免重复计算**:自底向上填表,复用子问题解 2. **保证合法性**:通过括号结构 `(A)B` 确保括号闭合[^1] 3. **完备性**:覆盖所有卡塔兰数组合(n=8 时共 1430 种)[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值