【问题描述】[中等]

【解答思路】

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]相关推荐

  1. [Leetcode][第1002题][JAVA][查找常用字符][计数][HashMap]

    [问题描述][简单] [解答思路] 计数法 1. minfreq存放最终重复字母的个数 freq存放每次遍历字符串的字母个数 2. minfreq初始化最大值,每遍历一个字符串后,比较minfreq[ ...

  2. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  3. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  4. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  5. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  6. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  7. [Leetcode][第216题][JAVA][数组之和3][回溯]

    [问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...

  8. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  9. [Leetcode][第77题][JAVA][组合][回溯]

    [问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...

最新文章

  1. [转]C# 2.0新特性与C# 3.5新特性
  2. pyqtdeploy教程_PyQtdeploy-V2.4 User Guide 中文 (一)
  3. SQL存储过程实例具体解释
  4. java登录界面命令_Java命令行界面(第10部分):picocli
  5. java8 函数式编程_您必须学习Java 8的函数式编程吗?
  6. 超出了GC开销限制– Java堆分析
  7. 【华为云技术分享】云图说|华为HiLens:端云协同多模态AI开发应用平台
  8. Python使用exec自动生成代码并执行,同时得到返回的变量
  9. kde重启_重启崩溃的 KDE
  10. 医学综合笔试计算机化考试,医学综合笔试实行计算机化考试考生手册.doc
  11. 非常实用的,使用SQL查询连续号码段。(做计费系统或SP的兄弟经常会用到)...
  12. Java : logback简单配置
  13. json格式化工具有哪些?在项目中使用什么工具来格式化JSON数据?
  14. mac 显示及隐藏文件的方法
  15. python关于excel插入图片
  16. 有什么小号音准测试软件,小号演奏家对小号初学者的一些建议 | 悦趣音乐中心...
  17. net-java-php-python-班级信息管理系统计算机毕业设计程序
  18. NTVDM CPU 遇到无效的指令的解决方法大全
  19. python学习笔记(一)数据处理
  20. C# 发送邮件方法2

热门文章

  1. 【APIO2015】完跪记
  2. 公式中表达单个双引号【】和空值【】的方法及说明
  3. Z-Blog 扩展数据库 字段 二次开发
  4. 凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...
  5. Win7的市场份额终于超过XP了,以后可以逐渐考虑放弃ie6/7了!
  6. 计算机与现代教育技术论文开题报告,计算机科学技术大学硕士与本科毕业论文开题报告...
  7. 2017年什么命_所谓“佛系”,真的不是什么都不做!
  8. JQuery.autocomplete扩展功能:实现多列自动提示
  9. spring 基于xml方式配置aop
  10. 实验7 寻址方式在结构化数据访问总的应用