【Leetcode每日一题】 综合练习 - 括号生成(难度⭐⭐)(76)

1. 题目解析

题目链接:22. 括号生成

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

问题描述

我们需要找出所有可能的、有效的括号序列。一个有效的括号序列指的是一个仅由'('和')'组成的字符串,并且满足以下条件:

  1. 左括号的数量始终大于等于右括号的数量,从左到右遍历字符串时。
  2. 左括号的总数与右括号的总数相等。
递归策略

我们采用递归的方法来解决这个问题。递归的核心在于,在每一步,我们都有两种选择:放置一个左括号或(在条件允许的情况下)放置一个右括号。

递归函数设计
void dfs(std::string& current, int step, int left)
  • current: 存储当前构建的括号序列的字符串。
  • step: 当前需要填入的位置(即current字符串的长度)。
  • left: 当前状态的字符串中已放置的左括号数量。
递归流程
  1. 递归结束条件
    • step等于目标长度(即2倍的括号对数)时,检查current是否为一个有效的括号序列。如果是,则将其加入答案列表中。
  2. 放置左括号
    • 如果left小于目标长度的一半(即剩余的位置足够放置等量的右括号),则可以在current的第step个位置放置一个左括号,并递归调用dfs函数,参数更新为step+1left+1。递归完成后,需要撤销这个左括号的放置,以便尝试其他可能性。
  3. 放置右括号
    • 如果当前已放置的右括号数量(step - left)小于已放置的左括号数量left,则可以在current的第step个位置放置一个右括号,并递归调用dfs函数,参数更新为step+1left(因为右括号的放置不影响左括号的数量)。同样,递归完成后需要撤销这个右括号的放置。

决策树的演示:

3.代码编写

class Solution {
    int left, right, n;
    string path;
    vector<string> ret;

public:
    vector<string> generateParenthesis(int _n) {
        n = _n;
        dfs();
        return ret;
    }
    void dfs() {
        if (right == n) {
            ret.push_back(path);
            return;
        }
        if (left < n) // 添加左括号
        {
            path.push_back('(');
            left++;
            dfs();
            path.pop_back();
            left--; // 恢复现场
        }
        if (right < left) // 添加右括号
        {
            path.push_back(')');
            right++;
            dfs();
            path.pop_back();
            right--; // 恢复现场
        }
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿丢丢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值