day43 20. 有效的括号(Java)

265 阅读2分钟

题目来源: 20. 有效的括号

题目描述:

  • 描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
    • 有效字符串需满足:
      • 左括号必须用相同类型的右括号闭合。
      • 左括号必须以正确的顺序闭合。
      • 每个右括号都有一个对应的相同类型的左括号。
示例1:
输入:s = "()"
输出:true

示例2:
输入:s = "(]"
输出:false

思路:栈+哈希表

  • 首先我们需要对给出的字符串进行遍历,具体操作如下:
    • 当我们遍历到一个左括号的时候,因为在这个左括号后面的左括号肯定会先完成闭合操作,(此操作是先遇到后闭合有点类似栈),因此我们可以先将这个左括号放入栈顶
    • 同理,如果我们遍历到一个右括号,我们此时需要找一个与之对应的左括号,二者完成一个闭合的操作,所以此时我们需要从栈顶汇总取出一个左括号并判断他们是否是相对应的括号
      • 如果不是相同的类型,或者栈中此时为空(没有左括号),返回false
    • 我们可以采用哈希表对括号进行存储,key存储右括号,value存储相对应的左括号
    • 完成遍历的操作后,如果栈空(已经没有左括号了),说明字符串中的所有左括号都找到了自己对应的右括号,那么就返回TRUE,否则,返回FALSE
    • 因为左括号与右括号是一一对应的,成对出现,所以字符串如果有效的话,一定是2的倍数,即字符串的长度为偶数,所以当字符串的长度为奇数,我们可以直接判断出字符串是无效的

具体实现:

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if(n % 2 == 1){
            return  false;
        }
        Map<Character, Character> map = new HashMap<Character, Character>() {{
            // 将 })] 作为key
            put('}', '{');
            put(']', '[');
            put(')', '(');
        }};
        // 新建一个栈
        LinkedList<Character> stack = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            // 如果c是 })], 则判断, 否则说明是({[ , 直接入栈
            if(map.containsKey(c)){
                // stack.peek() 获取栈顶元素
                if(stack.isEmpty() || stack.peek() != map.get(c)){
                    return false;
                }
                // 将栈顶移除(先进后出,栈顶是最接近 c 的左括号)
                stack.pop();
            }else{
                // 说明c是({[ , 直接入栈
            stack.push(c);
        }
        }
        return stack.isEmpty();
    }
}

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情