LeetCode 22. 括号生成

题目描述

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

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

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

问题分析

这是一道DFS的题。递归函数有3个可变参数:剩余左括号数left,剩余右括号数right和当前的字符串。初始时,left是n,right是n,当前的字符串是""。每次在DFS函数中时,如果剩余左括号数大于0,则在传入的当前的字符串后面连接上左括号,并以新的参数进入DFS函数;同样的,每次在DFS函数中时,如果剩余右括号数大于0,则在传入的当前的字符串后面连接上右括号,并以新的参数进入DFS函数,以上是DFS函数的基本递归思路。而递归基是在DFS函数中的开始处判断的,如果当前传入的左括号剩余数大于右括号剩余数,说明传入的当前字符串已经是无效了的,就不用往后进行了,需及时return。如果当前传入的左括号剩余数和右括号剩余数都等于0,则说明传入的当前字符串是已经满足条件了的,加入答案数组中并return。最终进行完所有搜索后,返回答案数组ans。

代码实现

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        DFS(n, n, "", ans);
        return ans;
    }
    void DFS(int left, int right, string out, vector<string>& ans){
            if(left>right)
                return;
            if(left==0 && right==0){
                ans.push_back(out);
                return;
            }
            if(left>0)
                DFS(left-1, right, out+"(", ans);
            if(right>0)
                DFS(left, right-1, out+")", ans);
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值