java练习(43)

ps:题目来自力扣

括号生成

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

复制代码
import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<String> generateParenthesis(int n) {
        // 用于存储最终生成的有效括号组合的列表
        List<String> result = new ArrayList<>();
        // 调用回溯方法开始生成括号组合
        backtrack(result, new StringBuilder(), 0, 0, n);
        return result;
    }

    /**
     * 回溯方法,用于递归生成有效的括号组合
     * @param result 存储最终结果的列表
     * @param current 当前正在构建的括号组合
     * @param open 当前已使用的左括号数量
     * @param close 当前已使用的右括号数量
     * @param max 总共需要的括号对数
     */
    private void backtrack(List<String> result, StringBuilder current, int open, int close, int max) {
        // 当已使用的左括号和右括号数量都达到 max 时,说明已经生成了一个有效的括号组合
        if (current.length() == max * 2) {
            result.add(current.toString());
            return;
        }

        // 如果左括号的使用数量小于 max,继续添加左括号
        if (open < max) {
            current.append("(");
            // 递归调用,左括号使用数量加 1
            backtrack(result, current, open + 1, close, max);
            // 回溯操作,撤销上一步添加的左括号
            current.deleteCharAt(current.length() - 1);
        }

        // 如果右括号的使用数量小于左括号的使用数量,继续添加右括号
        if (close < open) {
            current.append(")");
            // 递归调用,右括号使用数量加 1
            backtrack(result, current, open, close + 1, max);
            // 回溯操作,撤销上一步添加的右括号
            current.deleteCharAt(current.length() - 1);
        }
    }
}

代码解释

本题要求生成 n 对有效的括号组合。我们可以使用回溯算法来解决这个问题。回溯算法的核心思想是通过递归的方式尝试所有可能的组合,并在满足特定条件时进行回溯。

具体步骤
  1. 初始化结果列表
    • 创建一个 ArrayList 类型的 result 列表,用于存储最终生成的有效括号组合。
  2. 调用回溯方法
    • 调用 backtrack 方法开始生成括号组合,传入结果列表、一个空的 StringBuilder 用于构建当前的括号组合、左括号使用数量初始值 0、右括号使用数量初始值 0 以及总共需要的括号对数 max
  3. 回溯方法 backtrack
    • 终止条件 :当 current 的长度等于 max * 2 时,说明已经生成了一个有效的括号组合,将其添加到结果列表中并返回。
    • 添加左括号 :如果左括号的使用数量小于 max,将左括号添加到 current 中,递归调用 backtrack 方法,左括号使用数量加 1,然后进行回溯操作,撤销上一步添加的左括号。
    • 添加右括号 :如果右括号的使用数量小于左括号的使用数量,将右括号添加到 current 中,递归调用 backtrack 方法,右括号使用数量加 1,然后进行回溯操作,撤销上一步添加的右括号。
  4. 返回结果
    • 当回溯过程结束后,返回存储所有有效括号组合的 result 列表。
相关推荐
小黄人软件1 小时前
C# ini文件全自动界面配置:打开界面时读ini配置到界面各控件,界面上的控件根据ini文件内容自动生成,点保存时把界面各控件的值写到ini里。
开发语言·c#
明天不下雨(牛客同名)2 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
多多*3 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
Android洋芋3 小时前
C语言深度解析:从零到系统级开发的完整指南
c语言·开发语言·stm32·条件语句·循环语句·结构体与联合体·指针基础
bjxiaxueliang3 小时前
一文详解QT环境搭建:Windows使用CLion配置QT开发环境
开发语言·windows·qt
Run_Teenage4 小时前
C语言 【初始指针】【指针一】
c语言·开发语言
苹果.Python.八宝粥4 小时前
Python第七章02:文件读取的练习
开发语言·python
胡图蛋.5 小时前
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
java·spring boot·后端
J不A秃V头A5 小时前
Redis批量操作详解
开发语言·redis
牛马baby5 小时前
Java高频面试之并发编程-01
java·开发语言·面试