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

本文介绍了两种解决LeetCode第20题的有效括号问题的方法:使用栈和HashMap。通过遍历字符串,结合栈的入栈和出栈操作,以及HashMap的映射关系,判断括号是否匹配。同时,对算法进行了优化,包括判断奇数长度的序列、使用Deque提升效率等。
摘要由CSDN通过智能技术生成
【问题描述】[中等]

在这里插入图片描述

【解答思路】
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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值