22. Generate Parentheses(dfs,括号的可能排列数)

本文介绍了一个算法问题,即如何生成所有可能的正确匹配的括号组合。通过深度优先搜索的方法,利用递归实现,详细解释了如何从(0,0)开始,遵循左括号数量大于等于右括号数量的原则,生成所有有效的括号序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

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

]

分析:

l表示左括号的数量,r表示右括号的数量。

原问题可以转换成求 (0,0)到(n,n) 路径。条件得满足l>=r

如果加一个左括号(0,0)->(1,0)  再加一个 右括号(1,0)->(1,1)

那么最终 能得到的合法序列就是一条从(0,0)到(n,n)的路径,我们把这条路径就录下来就可以了。

为了方便理解  上个图

 

如图 红线标记的路径,向上走一步添加一个左括号,向右走一步添加一个右括号。

ac代码:

class Solution { public:     vector<string> generateParenthesis(int n) {         vector<string>rets;         dfs(rets,"",0,0,n);         return rets;     }     void dfs(vector<string>&rets,string s,int l,int r,int n)     {         if(r==n)         {             rets.push_back(s);             return;         }         if(l<n)             dfs(rets,s+'(',l+1,r,n);         if(r<l)             dfs(rets,s+')',l,r+1,n);     } };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值