Java 编程练习之:括号匹配(Leecode题库)

1. 题目

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意:空字符串可被认为是有效字符串。
在这里插入图片描述

2. 相关知识

2.1 哈希表知识

  • 哈希表在建立的时候是 keyvalue 成对建立的;比如 map.put('[', ']'); 其中就默认 [key,而 ]value
  • .get() 用来获取哈希表对应 keyvalue,比如说哈希表里面有一条内容是map.put('[', ']'); 那么通过 map.get('[') 返回的结果就是 ]
  • .containsKey() 返回的类型是 boolean 型,如果存在这个 key 就返回 true 否则就 false。同样地,也有 containsValue() 的方法

2.2 栈的知识

  • .push() 用来将元素压入栈
  • .pop() 将元素弹出栈(返回栈顶的值,并且删除此元素)
  • .peek()得到栈顶元素的值(不删除这个元素)
  • .empty() 返回值为 boolean 型,判断栈是否为空
  • 当栈已经为空的时候,如果这个时候还继续进行 .pop() 的操作,会导致抛出异常 Line 21: java.util.EmptyStackException

3. 解题思路

  • 将字符串转换成字符数组进行索引 char[] ch = s.toCharArray();
  • 进行 ch.length 次循环:
  • 在每次循环中判断,这个是不是 Hash 表中的左括号(hash表中的 key值),如果是就将此元素 压栈,遇到右括号的时候(也就是不属于哈希表中 key 值的情况)就进行 弹栈,判断出栈的元素对应的哈希表中的 value是否和当前位置上的元素对应的值相同。if(map.get(stack.pop()) != ch[i]),不相同就代表括号不匹配。
  • 但其实这里还需要注意一个问题,就是:当输入是")" 单个括号的形式,这样的话会直接进行弹栈操作,如果这个时候栈里本来就是空的,就会抛出异常错误,所以我们必须在建立栈的时候给它塞入一个值,也就是我们开始做的 stack.add('?')。那这个时候,如果出现了上述 ")" 的情况,我们先检查栈是不是只有一个 "?" 元素,如果是,就证明第一个元素就是 右括号,那么就可以直接判断不匹配啦~
  • 那么其实还有一个问题,通过这样判断完之后,如果出现这种情况 "()[" 那么在整个循环结束后,栈里面还有东西没出来,所以我们应该在最后返回的时候规定,如果在循环结束的时候 栈里不只有 "?" 元素,那么这个匹配就是有问题的。

4. 代码

class Solution {
    public static boolean isValid(String s) {

        HashMap<Character, Character> map = new HashMap<>();
        map.put('[', ']');
        map.put('(', ')');
        map.put('{', '}');
        map.put('?','?');

        char[] ch = s.toCharArray();
        Stack stack = new Stack();
        stack.add('?');

        boolean temp = false;

        if (ch.length==0) return true;


        for (int i = 0; i < ch.length; i++) {

            if (map.containsKey(ch[i])) {
                stack.push(ch[i]);
            }
            else if (!map.containsKey(ch[i])) {
                if (stack.peek()== "?")return false;

                if(map.get(stack.pop()) != ch[i]) return false;
                else temp = true;
            }
        }
        if(map.get(stack.pop())=='?') temp = true;
        else temp = false;
        return temp;
    }
}

5. 运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值