• 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. }

  • 相关阅读:
    【数字IC验证进阶】SoC系统验证和IP模块验证的区别及侧重点分析
    C++学习第九天(list及其模拟实现)
    Boost之Log: (2)、代码练习
    基于ansible部署lamp架构(源码安装)
    k3s 快速入门 - traefix 使用 - 1
    GcExcel 6.2.3 for JAVA Crack GrapeCity Documents Excel
    高校校园网规划与设计
    CLR via C#(三)垃圾回收
    Node.js | 搭建后端服务器(含内置模块 http | url | querystring 的使用)
    基于HTML+CSS+JavaScript制作响应式个人博客模板源码( JavaScript期末大作业 )
  • 原文地址:https://blog.csdn.net/weixin_45848575/article/details/125593283