码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Leetcode22-有效括号生成详解


    Leetcode1-两数之和详解

    Leetcode2-两数相加详解

    Leetcode20-有效的括号详解

    Leetcode21-合并两个有序链表详解


    目录

    题目

    示例

    解析

    回溯法

    代码

    python代码

    Java代码


    题目

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

    让我们来分析一下题目:

    已知:生成括号的对数n

    目标:设计函数生成有效括号

    要求:输出所有有效括号组合(字符串)

    示例

    示例1

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

    示例2

    输入:n = 1
    输出:["()"]

    解析

    回溯法

    针对这个题目,我们已知的是括号的对数,例如2对括号,那么2对括号就对应2个左括号和2个右括号,这4个括号就有6种不同的排列组合,但是这6中排列组合中并不是所有组合都有效,所以我们可以用回溯法量所有组合进行排列,在排列的过程中进行有效性判断。

    让我们详细说明一下

    如下图所示,对于2对括号会有2个左括号和2个右括号

    对于这四个括号共有6中不同的排列组合,其中虚线框中为剩余的括号,这6种排列组合中只有2中是有效的

    我们知道当遇到一个右括号时,它前面必须要有一个左括号与之对应,即左括号的数量要值大于或等于右括号的数量(l >= r),如果左括号的数量小于右括号的数量,则必有一个右括号没有与之对应的左括号,让我们对每一种排列组合详细看一下有效或无效的原因

    代码

    python代码

    1. class Solution:
    2. def generateParenthesis(self, n: int) -> List[str]:
    3. result = [] # 建立列表,保存最后有效的括号组合
    4. self.backtracking(n, result, 0, 0, "") # 调用backtracking进行排列组合和有效判定,舒适化左右括号数量为0
    5. return result
    6. def backtracking(self, n, result, left, right, s):
    7. if left < right: # 当左括号数量小于右括号数量时,无效
    8. return
    9. if (left == n and right==n):
    10. result.append(s)
    11. return
    12. if left < n: # 当左括号数量有剩余时,添加左括号,进行回溯
    13. backtracking(n, result, left+1, right, s+"(")
    14. if right <n:
    15. backtracking(n, result, left, right+1, s+")") # # 当右括号数量有剩余时,添加左括号,进行回溯

    只看代码的话可能有些难以理解,让我们来看一些怎么回溯的

    首先窗帘一个空列表,然后开始进入递归

    首先得到的第一个组合“(())”

     

    然后从这里人开始回溯,从“(”又开始组合

     得到有一个有效的组合“()()”

     

    然后再回溯,代码结束执行

     所以大致的回溯流程如下

    Java代码

    1. class Solution {
    2. public List<String> generateParenthesis(int n) {
    3. List<String> result = new ArrayList<>();
    4. backtracking(n, result, 0, 0, "");
    5. return result;
    6. }
    7. private void backtracking(int n, List<String> result, int left, int right, String str) {
    8. if (right > left) {
    9. return;
    10. }
    11. if (left == n && right == n) {
    12. result.add(str);
    13. return;
    14. }
    15. if (left < n) {
    16. backtracking(n, result, left+1, right, str+"(");
    17. }
    18. if (right < left) {
    19. backtracking(n, result, left, right+1, str+")");
    20. }
    21. }
    22. }

  • 相关阅读:
    什么是剥头皮?为什么很多交易商会禁止?
    Simulink仿真封装中的参数个对话框设置
    神经网络结构图怎么看的,神经网络结果图如何看
    linux每天一个命令(ls)
    RocketMQ5.0的Broker的主备自动切换的设计与实现图解
    Talk预告 | 亚马逊云科技上海人工智能研究院肖天骏:基于视频的自监督物体遮挡补全分割
    论不使用除rsa之外的任何其他模块实现RSA加密解密,以及密钥存储
    【车载开发系列】自动驾驶技术--HUD技术
    【期末大作业】基于HTML+CSS+JavaScript南京大学网页校园教育网站html模板(3页)
    解决ModuleNotFoundError: No module named ‘skimage‘问题
  • 原文地址:https://blog.csdn.net/weixin_45848575/article/details/125593283
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号