【LeetCode & 剑指offer刷题】回溯法与暴力枚举法题4:Generate Parentheses

本文详细解析了LeetCode经典题目“Generate Parentheses”的解决方案,采用递归法生成所有合法的括号组合,适用于n对括号的情况。通过深度优先搜索策略,确保左括号与右括号正确配对,提供了C++实现代码。

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

Generate Parentheses

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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

C++
 
//问题:产生括号对
//方法一:回溯法(并没有回溯,应该就叫普通递归法)
/*
递归,并用两个变量(open, close)记录当前左括号和右括号的个数
 open < n (n为括号对数量)时添加左括号,close<open时添加右括号
Once we add a '(' we will then discard it and try a ')' which can only close a valid '('. Each of these steps are recursively called
举例:(n=3时的递归树)
                                --> (((,3,0,3--> (((),3,1,3--> ((()),3,2,3--> ((())),3,3,3 return
                    --> ((,2,0,3
                                              --> (()(, 3,1,3--> (()(), 3,2,3--> (()()), 3,3,3 return
"",0,0,3 --> (,1,0,3            --> ((), 2,1,3
                                              --> (()), 2,2,3--> (())(, 3,2,3--> (())(), 3,3,3 return
                   
                                              --> ()((,3,1,3--> ()((),3,2,3--> ()(()),3,3,3 return
                    --> (),1,1,3--> ()(, 2,1,3
                                              --> ()(),2,2,3--> ()()(,3,2,3--> ()()(),3,3,3 return
                               
*/
class Solution
{
public :
    vector < string > generateParenthesis ( int n )
    {
        vector < string > ans ;
        recursion ( ans , "" , 0 , 0 , n );
        return ans ;
    }
   
private :
    void recursion ( vector < string >& ans , string s , int open , int close , int n )
    {
        if ( s . length () == 2 * n )
        {
            ans . push_back ( s );
            return ;
        }
       
        //深度优先搜索,分支为加左括号和右括号,深度方向左括号和右括号保证匹配
        if(open < n) recursion ( ans , s+'(', open+1 , close , n ); //递归树有很多分支,遍历到所有可能的情况 
        if(close < open) recursion ( ans , s+')' , open , close+1 , n ); //加右括号,直到左右括号相匹配
    }
};
 
 

 

转载于:https://www.cnblogs.com/wikiwen/p/10229461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值