题解 | 「力扣」第 20 题:有效的括号(简单)

217 阅读1分钟

摘要:后进先出很重要,一定要把后进先出说清楚。栈是缓存,不确定的先存起来,确定了结果以后再拿出去。栈是动态的线性数据结构。


题解 | 「力扣」第 20 题:有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1<=s.length<=1041 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成

思路分析

把「后进先出」说清楚。

  • 遍历到左括号的时候,在它的右边一定需要一个 对应的 右括号与之匹配。因此还不能确定结果的括号需要先「缓存」起来;
  • 根据这道问题的特点,后遍历到的括号先匹配,因此当前是数据结构「栈」的应用场景。

参考代码 1

import java.util.ArrayDeque;
import java.util.Deque;


public class Solution {

    public boolean isValid(String s) {
        int len = s.length();
        // 特殊情况判断
        if ((len % 2) == 1) {
            return false;
        }

        char[] charArray = s.toCharArray();
        Deque<Character> stack = new ArrayDeque<>();
        for (char c : charArray) {
            switch (c) {
                case '(':
                    stack.addLast(')');
                    break;
                case '[':
                    stack.addLast(']');
                    break;
                case '{':
                    stack.addLast('}');
                    break;
                default:
                    if (stack.isEmpty() || stack.removeLast() != c) {
                        return false;
                    }
                    break;
            }
        }
        return stack.isEmpty();
    }
}

参考代码 2

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;

public class Solution {

    public boolean isValid(String s) {
        int len = s.length();
        if (len == 0) {
            return true;
        }
        // 奇数长度一定不是有效括号
        if ((len % 2) == 1) {
            return false;
        }

        char[] charArray = s.toCharArray();
        Map<Character, Character> hashMap = new HashMap<>();
        hashMap.put(')', '(');
        hashMap.put(']', '[');
        hashMap.put('}', '{');

        Deque<Character> stack = new ArrayDeque<>();
        for (char c : charArray) {
            // 如果遍历到右括号,检查是否匹配
            if (hashMap.containsKey(c)) {
                // 栈为空和栈顶与当前不匹配都不能称之为"有效"
                if (stack.isEmpty() || !hashMap.get(c).equals(stack.removeLast())) {
                    return false;
                }
            } else {
                // 遍历到左括号就加入栈
                stack.addLast(c);
            }
        }
        return stack.isEmpty();
    }
}