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

力扣面试150题--括号生成

Day 73

题目描述

在这里插入图片描述

思路

初次思路:
代码分为两个部分
第一个部分,获取不重复的括号组合
第二个部分,判断这个组合是否合法
第二部分式常见题 这里不赘述了,以下说明如何获取不重复的括号组合

  1. 使用first和end来记录左括号和右括号的数量
  2. back函数中,如果左右括号剩余数量都为0说明得到一个括号组合
  3. 这里确保不重复起始很简单,对于每一个空格 可能会有左右括号两种情况,就是用回溯即可,因为左右括号数量有限,这样做不会出现重复。(不知道咋说 可以自己画图理解下
class Solution {public List<String> generateParenthesis(int n) {StringBuilder x=new StringBuilder();char[]kuo=new char[]{'(',')'};List<String>res=new ArrayList<>();back(n,n,x,kuo,res);return res;}public void back(int first,int end,StringBuilder x,char[]kuo,List<String> res){if(first==0&&end==0){if(pan(x)){//合法res.add(x.toString());}return;}if(first>0){x.append('(');first--;back(first,end,x,kuo,res);x.deleteCharAt(x.length()-1);first++;}if(end>0) {x.append(')');end--;back( first, end, x, kuo, res);x.deleteCharAt(x.length() - 1);end++;}}public  boolean pan(StringBuilder x) {Stack<Character>stack=new Stack<>();for(int i=0;i<x.length();i++){if(x.charAt(i)=='('){stack.push(x.charAt(i));}else if(x.charAt(i)==')'){if(stack.isEmpty()){return false;}else if(stack.peek()=='('){stack.pop();}else{return false;}}}return stack.isEmpty();}
}

优化思路:提交后发现时间复杂度很高 ,就去翻题解了
发现不需要专门判断括号的合法性,有直接获取合法括号组合的做法见下:
相较上面的代码,有一处变化,即为添加右括号时,只有在右括号剩余数量大于左括号时才添加,仔细思考一下,如果不在这种情况下添加右括号会有以下两种情况:

  1. 左右括号剩余数量相同时,即为在此之前括号都是合法的,此时添加一个)肯定不合法,因为)必须出现在(后 如()())
  2. 左括号数量大于右括号,这种情况就更好理解了 不赘述了
class Solution {public List<String> generateParenthesis(int n) {StringBuilder x=new StringBuilder();char[]kuo=new char[]{'(',')'};List<String>res=new ArrayList<>();back(n,n,x,kuo,res);return res;}public void back(int first,int end,StringBuilder x,char[]kuo,List<String> res){if(first==0&&end==0){res.add(x.toString());return;}if(first>0){x.append('(');first--;back(first,end,x,kuo,res);x.deleteCharAt(x.length()-1);first++;}if(end>first) {x.append(')');end--;back( first, end, x, kuo, res);x.deleteCharAt(x.length() - 1);end++;}}
}
http://www.dtcms.com/a/275412.html

相关文章:

  • S7-200 SMART CPU 密码清除全指南:从已知密码到忘记密码的解决方法
  • AI产品经理面试宝典第11天:传统软件流程解析与AI产品创新对比面试题与答法
  • MongoDB数据库入门到集群部署企业级实战
  • linux使用lsof恢复误删的nginx日志文件——筑梦之路
  • (C++)STL:list认识与使用全解析
  • Kafka Schema Registry:数据契约管理的利器
  • python数据分析及可视化课程介绍(01)以及统计学的应用、介绍、分类、基本概念及描述性统计
  • [BUUCTF 2018]Online Tool
  • 事件驱动设计:Spring监听器如何像咖啡师一样优雅处理高并发
  • java单例设计模式
  • Leet code 每日一题
  • 基于随机森林的金融时间序列预测系统:从数据处理到实时预测的完整流水线
  • FreeRTOS—动态创建与删除任务实战;静态创建与删除任务实战
  • ubuntu18.04 升级Ubuntu 20.04
  • 外设数据到昇腾310推理卡 之一
  • Linux进程管理的核心:task_struct中的双链表与网状数据结构
  • 【攻防实战】记一次DC2攻防实战
  • 【Linux仓库】虚拟地址空间【进程·陆】
  • DVWA靶场通关笔记-XSS DOM(Low级别)
  • 力扣-19. 删除链表的倒数第N个节点
  • 前端内容-ES6
  • Vue.js:从 Web 到桌面的跨端实践与技术选型指南
  • 虚拟现实的镜廊:当技术成为存在之茧
  • AI之DL之VisualizationTool:ai-by-hand-excel的简介、安装和使用方法、案例应用之详细攻略
  • 生成式对抗网络(GAN)模型原理概述
  • 用 Python 将分组文本转为 Excel:以四级词汇为例的实战解析
  • Socket到底是什么(简单来说)
  • HTTP和HTTPS部分知识点
  • w460实习生管理系统
  • Linux中Gitee的使用