[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
[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]相关推荐
- [Leetcode][第1002题][JAVA][查找常用字符][计数][HashMap]
[问题描述][简单] [解答思路] 计数法 1. minfreq存放最终重复字母的个数 freq存放每次遍历字符串的字母个数 2. minfreq初始化最大值,每遍历一个字符串后,比较minfreq[ ...
- [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]
[问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...
- [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]
[问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...
- [Leetcode][第78题][JAVA][子集][位运算][回溯]
[问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
[问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...
- [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]
[问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...
- [Leetcode][第216题][JAVA][数组之和3][回溯]
[问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- [Leetcode][第77题][JAVA][组合][回溯]
[问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...
最新文章
- [转]C# 2.0新特性与C# 3.5新特性
- pyqtdeploy教程_PyQtdeploy-V2.4 User Guide 中文 (一)
- SQL存储过程实例具体解释
- java登录界面命令_Java命令行界面(第10部分):picocli
- java8 函数式编程_您必须学习Java 8的函数式编程吗?
- 超出了GC开销限制– Java堆分析
- 【华为云技术分享】云图说|华为HiLens:端云协同多模态AI开发应用平台
- Python使用exec自动生成代码并执行,同时得到返回的变量
- kde重启_重启崩溃的 KDE
- 医学综合笔试计算机化考试,医学综合笔试实行计算机化考试考生手册.doc
- 非常实用的,使用SQL查询连续号码段。(做计费系统或SP的兄弟经常会用到)...
- Java : logback简单配置
- json格式化工具有哪些?在项目中使用什么工具来格式化JSON数据?
- mac 显示及隐藏文件的方法
- python关于excel插入图片
- 有什么小号音准测试软件,小号演奏家对小号初学者的一些建议 | 悦趣音乐中心...
- net-java-php-python-班级信息管理系统计算机毕业设计程序
- NTVDM CPU 遇到无效的指令的解决方法大全
- python学习笔记(一)数据处理
- C# 发送邮件方法2
热门文章
- 【APIO2015】完跪记
- 公式中表达单个双引号【】和空值【】的方法及说明
- Z-Blog 扩展数据库 字段 二次开发
- 凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...
- Win7的市场份额终于超过XP了,以后可以逐渐考虑放弃ie6/7了!
- 计算机与现代教育技术论文开题报告,计算机科学技术大学硕士与本科毕业论文开题报告...
- 2017年什么命_所谓“佛系”,真的不是什么都不做!
- JQuery.autocomplete扩展功能:实现多列自动提示
- spring 基于xml方式配置aop
- 实验7 寻址方式在结构化数据访问总的应用