leetcode刷题记录2-有效的括号

259 阅读1分钟

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

题目链接

示例1

输入: "()"
输出: true

示例2

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

解法1,利用栈的特性和题目的特殊性

class Solution {
public static boolean isValid(String s) {
        //空字符串,也是有效字符串
        if (s.isEmpty()) {
            return true;
        }
        //建立一个字符型的栈
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            //这里的思路是,遇到一种类型的左闭合括号,就将其对应的右闭合括号压入栈中
            if (c == '(') {
                stack.push(')');
            } else if (c == '{') {
                stack.push('}');
            } else if (c == '[') {
                stack.push(']');
            } else {
                //没有匹配的左括号-栈为空或者弹出栈的字符和现有循环的字符不匹配
                if (stack.isEmpty() || stack.pop() != c) {
                    return false;
                }
            }
        }
        //栈已经全部清空-返回true,有未匹配的字符-返回false
        return stack.isEmpty();
    }
}

解法2,利用一个hashmap作为检验

public static boolean isValid(String s) {
        //空字符串,也是有效字符串
        if (s.isEmpty()) {
            return true;
        }
        //奇数个的情况,不必继续校验
        if (s.length() % 2 != 0) {
            return false;
        }
        //建立一个字符型的栈
        Stack<Character> stack = new Stack<>();
        //用来检验的hashmap
        HashMap<Character, Character> hashMap = new HashMap<Character, Character>() {{
            put('}', '{');
            put(']', '[');
            put(')', '(');
        }};
        for (char c : s.toCharArray()) {
            if (stack.isEmpty()) {
                stack.push(c);
            } else if (hashMap.get(c) == stack.peek()) {
                //遇到符合要求的右括号,弹出栈顶的元素
                stack.pop();
            } else {
                //否则继续压入元素
                stack.push(c);
            }
        }
        return stack.isEmpty();
    }