有效的括号

Leecode 20

Posted by donlv1997 on October 29, 2021

hit count image

“关于堆栈”

题干

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

有效字符串需满足:

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

示例

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示:

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

Java堆栈

如果单纯的想实现后进先出堆栈,可以用java.util.Stack,注意取元素时,pop()为出栈并接收返回值,而peek()只是获得栈顶的值(不出栈)具体查看下面的代码:

peek意为窥视,java中很多数据结构都有peek()方法,作用都是窥视一眼首个元素的值

import java.util.Stack;

/**
 * @author stitch
 * @version Main.java, v 0.1 2021年10月29日 4:22 下午 stitch
 */
public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        // 3
        System.out.println(stack.peek());
        // 3
        System.out.println(stack.pop());
        // 2
        System.out.println(stack.pop());
        // 1
        System.out.println(stack.pop());
    }
}

Java还有一种更通用的数据结构,双向队列deque,支持双向插入、双向删除,具体如下:

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author stitch
 * @version Main.java, v 0.1 2021年10月29日 4:22 下午 stitch
 */
public class Main {
    public static void main(String[] args) {

        // deque implemented by linked list
        Deque<Integer> queue = new LinkedList<>();

        queue.addFirst(1);
        queue.addFirst(2);
        queue.addLast(3);
        queue.addLast(4);

        // [2, 1, 3, 4]
        System.out.println(queue);
        // 2
        System.out.println(queue.removeFirst());
        // 4
        System.out.println(queue.removeLast());
    }
}

题解

由于一个右括号必定匹配离它最近的一个左括号,因此括号的合法性判断是一个典型的堆栈问题

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * @author stitch
 * @version Main.java, v 0.1 2021年10月29日 4:22 下午 stitch
 */
public class Main {
    public boolean isValid(String s) {
        Map<Character, Character> dict = new HashMap<>();
        dict.put(')', '(');
        dict.put(']', '[');
        dict.put('}', '{');

        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            if (dict.containsKey(c)) {
                if (stack.isEmpty() || dict.get(c) != stack.peek()) {
                    return false;
                }
                stack.pop();
            } else {
                stack.push(c);
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println(new Main().isValid("()[]{}"));
        System.out.println(new Main().isValid("([)]"));
    }
}