LeetCode刷题系列:22

题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

解题思路

这道题只能基于深度优先搜索的方法来进行,问题在于如何优化。
给定长度的括号对数,生成的字符串长度是相同的。并且,字符串只能由'('‘)'组成,所以,进行深度优先遍历的时候每一层最多只有两个选择。
我们当然可以每层都枚举这两个选择,最终生成的组合就枚举了所有的可能,但是会出现大量的无效的组合,优化算法就是要在这个过程中避免生成无效的组合。
具体而言:

  • 如果当前'('的数量和')的数量相同,那么就不能在接下来的一个字符串中枚举')字符,那样必然生成无效的组合。
  • 如果剩余的搜索深度不足以使得')''('相等,即当前的'(的数量达到了临界值,之后的字符必须都是')才能使得括号匹配

在搜索的过程中,每一层的搜索都要检查上述的两点,这样就可以在搜索的过程中避免所有的无效组合。

代码

class Solution
{
public:
    vector<string> generateParenthesis(int n)
    {
        auto res = get(0, 2 * n);
        vector<string> ans(res.size());
        int idx = 0;
        for (auto i : res)
        {
            ans[idx++] = i;
        }
        return ans;
    }

    list<string> get(int flag, int n)
    {
        if (n == 0)
            return {""};
        list<string> ans;
        if (flag > 0)
        {
            auto res = get(flag - 1, n - 1);
            string nstr = ")";
            for (auto i : res)
            {
                ans.push_back(nstr + i);
            }
        }
        if (flag < n)
        {
            auto res = get(flag + 1, n - 1);
            string nstr = "(";
            for (auto i : res)
            {
                ans.push_back(nstr + i);
            }
        }

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值