20. 有效的括号

「力扣」20. 有效的括号

题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

题解

本题是一个典型的使用这种数据结构解题的题目,我们来分析下解题思路。

循环字符串,遇到左括号的时候将其放入到中,遇到右括号,则查看栈顶元素是否是该右括号对应的左括号,如果是则将栈顶元素弹出。

public boolean isValid(String s) {
    // 根据题目描述中提示的内容,无需判断s是空的,也不用考虑字符串中有其他字符。
    
    // 首先可以定义一个Map用于存储括号的关系,因为后面我要使用右括号查小括号,所以K=大括号,V=小括号
    Map<Character, Character> map = new HashMap<>();
    map.put(')', '(');
    map.put(']', '[');
    map.put('}', '{');

    // 定义一个栈
    Deque<Character> stack = new LinkedList<>();
    // 循环字符串s
    for (int i = 0; i < s.length(); i++) {
        // 如果是左括号, 肯定不存在于map中
        char c = s.charAt(i);
        if (!map.containsKey(c)) {
            stack.push(c);
        } else { // 如果是右括号,则查看下栈顶是否是左括号,如果确实是对应的左括号,则弹出该元素。
            if (map.get(c) == stack.peek()) {
                stack.pop();
            } else { // 否则直接返回非有效括号
                return false;
            }
        }
    }
    return stack.isEmpty(); // 如果是空的,则说明是有效的括号(比如字符串是[])
}

提交到力扣:

提交结果

这里说吐槽下Java中对于Deque的设计,没有遵循单一原则,方法很多,很混乱,如果是当作栈来使用的话,则一下方法是等价的。

方法1方法2
push(e)addFirst(e)
pop()removeFirst()
peek()getFirst()

如果是当队列来使用则如下方法是等价的。

方法1方法2
add(e)addLast(e)
offer(e)offerLast(e)
remove()removeFirst()
poll()pollFirst()
element()getFirst()
peek()peekFirst()

标签: 有效的括号

添加新评论