[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]

【问题描述】[中等]

在这里插入图片描述

【解答思路】

1. 栈

如果是一个合法的括号序列,遍历到一个右括号(i)时,那么它的前一个括号(i-1)必定是它的另一半(左括号)。反之不是它的另一半或者前面没有括号时,那这个序列必定是非法括号序列。
思路:利用一个stack辅助保存括号,遇见左括号时入栈对应的右括号,遇到右括号时

  • 栈空,证明前面没有匹配括号 多余的右括号
  • 栈非空弹出栈顶元素进行比较操作
    最后判断栈是否为空
  • 空 括号匹配
  • 非空 多余的左括号

要么在入栈时根据不同类别入栈右括号 要么出栈的时候根部不同类别作判断 至少进行一次分类讨论
时间复杂度:O(N) 空间复杂度:O(N)

优秀代码
class Solution {public boolean isValid(String s) {int len = s.length();if (s == null || len == 0) return true;if (len % 2 != 0) {// 如果长度为奇数,必然至少有一个括号没有匹配return false;}Deque<Character> stack = new ArrayDeque<>();for (char ch : s.toCharArray()) {if (ch == '(') {stack.addLast(')');} else if (ch == '[') {stack.addLast(']');} else if (ch == '{') {stack.addLast('}');} else if (stack.isEmpty() || stack.removeLast() != ch) {return false;}}return stack.isEmpty();}
}
   public boolean isValid(String s) {if(s.isEmpty())return true;Stack<Character> stack=new Stack<Character>();int n = s.length();for(int i = 0;i<n;i++){char a = s.charAt(i);if(a=='(')stack.push(')');else if(a=='{')stack.push('}');else if(a=='[')stack.push(']');else{if(stack.isEmpty()||stack.pop()!=a ){return false;}}}return stack.isEmpty();}

借助栈,对字符串进行字符遍历,如果字符是左括号,则入栈,左括号为’(’,’{’,’[’,如果字符是右括号,则出栈,并将右括号与左括号联合比较,判断是否可以组成有效的括号,有效括号是"()","{}","[]",如果不能组成,则返回错误

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '{' || c == '(' || c == '[') {stack.push(c);} else {char p = stack.empty() ? '\0' : stack.pop();if ((c == '}' && p != '{') || (c == ']' && p != '[')|| (c == ')' && p != '(')) {return false;}}}return stack.empty();}
}
2. HashMap

时间复杂度:O(N) 空间复杂度:O(1)

public boolean isValid(String s) {if (s == null) {// 如果输入字符为空没有必要继续下去,直接返回falsereturn false;}int len = s.length();if (len % 2 != 0) {// 如果长度为奇数,必然至少有一个括号没有匹配return false;}Map<Character, Character> pairs = new HashMap<>();pairs.put(')', '(');pairs.put(']', '[');pairs.put('}', '{');Deque<Character> stack = new LinkedList<>();for (int i = 0; i < len; i++) {char current = s.charAt(i);if (pairs.containsKey(current)) {// 如果栈已经为空了,说明右括号比左括号多,不匹配,直接返回false// 当第一次出现右括号的时候, 栈顶元素必然为左括号,不然不匹配,直接返回falseif (stack.isEmpty() || stack.peek() != pairs.get(current)) {return false;}stack.pop();} else {stack.push(current);}}// 如果最后栈不为空,说明左括号多于右括号,不匹配,返回falsereturn stack.isEmpty();
}

【总结】

1. 优化

1.1 判断长度为奇数时 直接返回错误
1.2 使用Deque 代替 stack
stack在基于数组实现上效率低 扩容效率低

初始化
Deque<Character> stack = new ArrayDeque<>();
Deque<Character> stack = new LinkedList<>();

1.3 字符串转z字符数组遍历 速度较快

String s;
char[] ch=s.toCharArray()
2.Deque

在这里插入图片描述

在这里插入图片描述

参考文章:https://www.cnblogs.com/lxyit/p/9017350.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D 物体移动方法总结

1. 简介 在Unity3D中&#xff0c;有多种方式可以改变物体的坐标&#xff0c;实现移动的目的&#xff0c;其本质是每帧修改物体的position。 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态&#xff0c;它包括 位置(position)&#xff0c; 旋转(rotati…

leetcode之回溯backtracing专题3

17 Letter Combinations of a Phone Number 手机上每个数字按钮旁边都有3-4个字母&#xff0c;输入数字字符串&#xff0c;输出可能的字母组合。  例如输入&#xff1a;”23”  输出&#xff1a;[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]…

第二十一期:拜托!面试不要再问我Spring Cloud底层原理

毫无疑问&#xff0c;Spring Cloud 是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面&#xff0c;其底层的很多原理&#xff0c;很多人可能并不知晓。 因此本文将通过大量的手绘图&#xff0c…

springBoot修改代码不需要重启-热部署

springboot每次修改代码都需要重启项目&#xff0c;进行热部署后就不需要每次修改代码都要重启项目了 热部署&#xff1a; 需要在pom.xml里进行配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools&…

[Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

【问题描述】[中等] 【解答思路】 其实就是深拷贝的一个实现&#xff0c;深拷贝就是对于所有的指针成员&#xff0c;不能仅仅是赋值&#xff0c;还有重新分配空间。 深拷贝反应在本题中就是&#xff0c;所有的结点需要重新new出来&#xff0c;而不是直接赋值。 整体的思路依然…

阅读目录(置顶)(长期科技领域知识)

第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高&#xff0c;发展前景更好&#xff1f; 第五期:干货总结&#xff1a;中级前端工程师必须要掌握的27个JavaScript 技巧 第六期…

leetcode之回溯backtracing专题4

131 Palindrome Partitioning 输入一个字符串s&#xff0c;将s分割为n个子串&#xff0c;每个子串都是一个回文。返回s有多少种分割方式。  例如输入&#xff1a;“aab”  输出&#xff1a;[ [“aa”,”b”], [“a”,”a”,”b”] ]  思路&#xff1a;这是一个不断将问…

[Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

【问题描述】[简单] 【解答思路】 千万不要想复杂了 不是三维空间 是一维空间 &#xff01; 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是&#xff1a;直接或间接相邻的同色方格构成的整体。 可以发现&#xff0c;「色块」就是被不同颜色的方…

第六章 参数估计(续)

区间估计 问题&#xff1a;点估计估计的参数有多大概率是正确的&#xff1f;用区间估计来表示。 置信区间 设总体X的分布函数F(x;θ)&#xff0c;θ未知&#xff0c;对给定值α(0<α<1)&#xff0c;有两个统计量θ^Lθ^L(X1,X2,...Xn),θ^Uθ^U(X1,X2,...Xn)&#xff0c…

第六十八期:程序员与医生

8月25日 以下文章来源于崖边小生 &#xff0c;作者道友留步 程序员与医生 久病未能成医&#xff0c;然而却悟出了程序员与医生的道理。细想来&#xff0c;程序员和医生这个职业竟如此相似。 职业的诞生 上帝创造了人类&#xff0c;而人类又创造了程序。上帝所创造的人类并…

【数据结构与算法】计数、基数、桶 O(n) 不基于比较

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 桶排序–>分区间桶快速排序&#xff08;归并排序&#xff08;稳定性&#xff09;&#xff09;–>取出结果 计数排序&#xff08;特殊的桶排序&#xff09;–>分单个桶…

java核心-多线程-Java多线程编程涉及到包、类

Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包&#xff0c;主要是线程基础类 <1>Thread<2>Runnable<3>ThreadLocal java.util包&#xff0c;主要是线程基础类和并发工具类 <1>基础线程类Callable、Futu…

第六十九期:【学习分享】温水里的程序员,技术将成为温水

张泰峰 7月7日 七月&#xff0c;炎炎的夏日&#xff0c;疯狂的暴雨不分昼夜&#xff0c;侵袭着这座城。早上七点&#xff0c;我骑着摩拜单车出发去往地铁站&#xff0c;誓死如归一般的&#xff0c;挤进地铁。像往常一样&#xff0c;骑车、挤地铁、打卡上班。 相信大家都跟我一…

第七章 假设检验

假设检验的目的是通过收集到的数据&#xff0c;来验证某个想要得到的结论。 假设检验的思想是&#xff1a;小概率反证法思想。 显著性检验是本章的主要内容。下面从实际例子来通俗的理解一下显著性检验。 显著性检验中有几个概念不太好理解。 嫌犯X是否有罪 有这样一个事件…

第七十期:IT技术人员的自我修养

8月4日 以下文章来源于空山新雨的技术空间 &#xff0c;作者空山新雨的技术空间 前言 在IT领域摸爬滚打多年&#xff0c;从一个普通程序员到技术主管&#xff0c;到技术经理&#xff0c;再到技术总监&#xff0c;踩过不少坑、加过不少班&#xff0c;也背过不少锅。 在提升自…

NOI2004郁闷的出纳员

传送门 题目看起来玄乎,但其实只需要一点点小 trick 就可以了. 我们可以用一个全局的 delta 来维护工资的调整记录 对于每一个新加入的员工,先判断是否低于最低工资下限,如果是,直接踢出,不做任何操作,否则,将其插入 Treap 中,不过这时为了不对以后的查询产生影响,我们要插入的…

【数据结构与算法】排序优化

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 总结&#xff1a;如何实现一个通用的高性能的排序函数&#xff1f; 一、如何选择合适的排序算法&#xff1f; 1.排序算法一览表 时间复杂度是稳定排序&#xff1f;是原地排…

第七章 假设检验(2)

接上文。 正态总体均值、方差的假设检验 单个正态总体均值的假设检验、方差的假设检验&#xff1b;成对数据均值的假设检验、两个正态总体方差比的检验。根据检验统计量的分布分别称为:z检验、t检验、卡方检验、F检验。 分布原假设H0检验统计量备择假设H1拒绝域单正态(σ2已知…

第二十二期:动画讲解TCP,再不懂请来打我

TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官的青睐。 前言 TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官…

【数据结构与算法】二分查找

一、什么是二分查找&#xff1f; 二分查找针对的是一个有序的数据集合&#xff0c;每次通过跟区间中间的元素对比&#xff0c;将待查找的区间缩小为之前的一半&#xff0c;直到找到要查找的元素&#xff0c;或者区间缩小为0。 二、时间复杂度分析&#xff1f; 1.时间复杂度 …