1023_leetcode20 有效的括号


题目:

在这里插入图片描述


题解1:

我们可以利用栈 Stack 来解决这个问题。

  • 首先我们将括号间的对应规则存放在 hashMap 中,这一点应该毋容置疑;
  • 创建一个栈。
  • 遍历字符串,如果字符是左括号就直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。
  • 遍历结束,如果stack为空,返回 true。

代码1:

class Solution {
    public boolean isValid(String s) {
        // 括号之间的对应规则
        HashMap<Character ,Character> mappings = new HashMap<Character ,Character>();
        /*hashmap的使用方法*/
     
        mappings.put(')', '('); //将键/值对添加到 hashMap 中
        mappings.put('}', '{');
        mappings.put(']', '[');

        Stack<Character> stack = new Stack<Character>();
        char[] chars = s.toCharArray();  //toCharArray() 方法将字符串转换为字符数组。
        for (int i=0; i<chars.length; i++){
            if (mappings.containsKey(chars[i])){ //	检查 hashMap 中是否存在指定的 key 对应的映射关系
                char topelement = stack.empty() ? '#' : stack.pop();//测试栈是否为空
                //这行完全没懂啊
                
                if (topelement != mappings.get(chars[i])){
                    return false;
                }
            }else{
                stack.push(chars[i]);
            }
        }
        return stack.isEmpty();

    }
}

说明:

本段代码的逻辑是:

  • 首先创建hashmap,我们将括号间的对应规则存放在 Map 中;
  • 创建一个栈。
  • 遍历字符串,如果字符是左括号就直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。
  • 遍历结束,如果stack为空,返回 true。

补充

1. Java HashMap 方法
Java HashMap 常用方法列表如下:

方法描述
clear()删除 hashMap 中的所有键/值对
clone()复制一份 hashMap
isEmpty()判断 hashMap 是否为空
size()计算 hashMap 中键/值对的数量
put()将键/值对添加到 hashMap 中
putAll()将所有键/值对添加到 hashMap 中
putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove()删除 hashMap 中指定键 key 的映射关系
containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace()替换 hashMap 中是指定的 key 对应的 value。
replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get()获取指定 key 对应对 value
getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach()对 hashMap 中的每个映射执行指定的操作。
entrySet()返回 hashMap 中所有映射项的集合集合视图。
keySet()返回 hashMap 中所有 key 组成的集合视图。
values()返回 hashMap 中存在的所有 value 值。
merge()添加键值对到 hashMap 中
compute()对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

2. java Stack 类
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

序号方法方法描述
1boolean empty()测试堆栈是否为空。
2Object peek( )查看堆栈顶部的对象,但不从堆栈中移除它。
3Object pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象。
4Object push(Object element)把项压入堆栈顶部。
5int search(Object element)返回对象在堆栈中的位置,以 1 为基数。

结果:

在这里插入图片描述


题解2

要判断括号的有效性,左括号必须和右括号相对应。如果是有效括号,并且他们中间还有
括号,那么他们必须也是有效的,所以最简单的一种方式就是使用栈来解决。

我们遍历字符串中的所有字符

  1. 如 果 遇 到 了 左 括 号 , 就 把 对 应 的 右 括 号 压 栈( 比 如 遇 到 了 字 符 ‘(’ , 就 把 字 符 ‘)’ 压栈)。
  2. 如果遇到了右括号
    1)查看栈是否为空,如果为空,说明不能构成有效的括号,直接返回false。
    2)如果栈不为空,栈顶元素出栈,然后判断出栈的这个元素是否等于这个右括号,如果不等于,说明不匹配,直接返回false。如果匹配,就继续判断字符串的下一个字符。
  3. 最后如果栈为空,说明是完全匹配,是有效的括号,否则如果栈不为空,说明不完全匹配,不是有效的括号。

图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


代码2:

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        //遍历所有的元素
        for (char c : chars) {
            //如果是左,把对应的右压栈
            if (c == '(') {
                stack.push(')');
            } else if (c == '{') {
                stack.push('}');
            } else if (c == '[') {
                stack.push(']');
            } else if (stack.isEmpty() || stack.pop() != c) {
                return false;
            }
        }
        return stack.isEmpty();

    }
}

分析:

没有用到hashmap后续更新和维护比较耗时,但是运行速度更快。

结果:

Accepted
91/91 cases passed (1 ms)
Your runtime beats 98.94 % of java submissions
Your memory usage beats 79.49 % of java submissions (36.3 MB)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值