当前位置: 首页 > news >正文

【leetcode hot 100 22】括号生成

解法一:(回溯法)用两个整数记录左右括号数,以在回溯过程中保证先生成左括号,且左右括号数不能大于n。

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> result = new ArrayList<String>();
        StringBuffer temp = new StringBuffer();
        int left = 0, right = 0; // 用于标记目前左右括号的数目
        backtrace(n, result, temp, left, right);
        return result;
    }

    public void backtrace(int n, List result, StringBuffer temp, int left, int right){
        if(left==n && right==n){
            result.add(temp.toString());
            return;
        }
        if(right>n || left>n){
            return;
        }
        if(left>right){
            // 左括号数大于右括号数,左右括号都能加
            for(int i=0; i<2; i++){
                if(i==0){// 加左括号
                    temp.append('(');
                    backtrace(n, result, temp, left+1, right);
                    temp.deleteCharAt(temp.length()-1);  // 不是temp.deleteAt(temp.size()-1);
                }
                else{// 加右括号
                    temp.append(')');
                    backtrace(n, result, temp, left, right+1);
                    temp.deleteCharAt(temp.length()-1);
                }
            }
        }
        else{// 左括号数<=右括号数,只能加左括号
            temp.append('(');
            backtrace(n, result, temp, left+1, right);
            temp.deleteCharAt(temp.length()-1);
        }
    }
}

注意:

  • 要避免左右括号的数目大于指定的数目,不添加如下判断会导致一直回溯 -> 内存溢出:if(right>n || left>n){return;}
  • temp.deleteCharAt(temp.length()-1)而不是temp.deleteAt(temp.size()-1)
  • StringBufferString的方法:
    • result.add(temp.toString())
    • result.add(new String(temp))
http://www.dtcms.com/a/81900.html

相关文章:

  • 算法2--两数相加
  • 【nnUnetv2】Code分析
  • C++算法代码-植物生长算法求解多目标车辆路径规划问题
  • 从“不敢买大”到“按墙选屏”,海信电视如何凭百吋重构客厅?
  • 【Linux 维测专栏 1 -- Hung Task 分析与验证】
  • 第七章 狄克斯特拉算法
  • Python MRO 与菱形继承问题详解
  • 什么是 “超参数” ?
  • Android第五次面试总结(HR面)
  • 每日一题力扣1920.基于排列构建数组c++
  • FPGA 以太网通信(三)
  • 【达梦数据库】用户A删除用户B下的表数据
  • 【第15章】亿级电商平台订单系统-高可用架构设计
  • 协议-CAN-CANopen
  • Android音视频多媒体开源库基础大全
  • AD(Altium Designer)已有封装库的基础上添加器件封装
  • pytorch小土堆学习有感
  • 什么是TCP,UDP,MQTT?
  • Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套
  • BlockChain.java
  • 荣获全栈身份nodejs实现登录功能
  • DHCP工作原理
  • Floyd 算法--多源最短路
  • 在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18
  • WRF/Chem 模式技术解读:为大气污染治理提供有力支撑
  • 【设计模式】常用的设计模式详解
  • C#Dictionary值拷贝还是引用
  • 项目篇:模拟实现高并发内存池(2)
  • MFC中CString类型是如何怎么转std::string的
  • 基于大模型的下颌前突畸形预测及治疗方案研究报告