括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

参考https://mp.weixin.qq.com/s/_8LFejdp9yUMeKqrx-q9YQ

思路如下:

利用递归的思想,如何得到n对括号呢?  就是从n-1对括号来进行变化,所以我们要找到这个 n对括号和 n-1  对括号的关系:

generate(n) = "(" + generate(i) + ")" + generate(j) ,其中 i + j == n - 1

有如下场景:

1对:

()

2对:  n = 2 ,n -1 = 1

所以要么是i为1,要么是j为1.

(())        i为1

()()         j为1

3对:   n = 3, i + j = 2

()(())        i = 0, j= 2

()()()        i = 0, j= 2

(())()       i  = 1, j = 1

((()))       i=2, j=0

(()())      i =2 , j=0

依次类推...

所以代码写的思路就按照上面的,先固定i的值,随之就固定了j的值,因为两者相加等于n-1

然后把所有的情况都遍历完成即可

 

 

 

class Solution {
public:
    vector<string> generateParenthesis(int n) 
    {
          if (n == 0) return {""}; // 基本情况
          vector<string> ans;
          for (int i = 0; i < n; i++)
          {
              for (string left : generateParenthesis(i)) // 挑选 s
              {
                  for (string right : generateParenthesis(n - i - 1)) // 挑选 t
                  {
                      
                      ans.push_back("(" + left + ")" + right); // 构造
                  }
              }
              
          }
        
        
              
                  
                      
          return ans;    
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值