1121-括号匹配

括号匹配

题目大意:给出包括大中小括号随机排列的一个String s,判断是否为左右闭合(左右括号顺序对应)
解题思路:利用栈的特性去解决该问题,需要考虑边界栈空的情况
题解及注释:

class Solution {
    // 定义一个hashMap用于匹配括号右边
    private static final Map<Character, Character> map = new HashMap<Character, Character>(){{
        put('(',')');put('{','}');put('[',']');put('?','?');
    }};
    public boolean isValid(String s) {
        // 如果s为有效String的情况下第一个字符不在map的key值中,这种情况下说明有其他字符,直接返回false
        if (s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
        // 这里用链表代替栈结构,主要方法为:addLast 最后新增一个节点;removeLast 移除最后一个节点并返回
        LinkedList stack = new LinkedList<Character>(){{add('?'); }};
        // 遍历该字符串
        for(Character c: s.toCharArray()) {
            // 当是左边括号的情况,入栈等待右边匹配
            // 当是右边括号的情况,将栈道最后一个字符拿出来判断是否与字符c相等,相等即闭合,否则就不符合题目要求
            if (map.containsKey(c))stack.addLast(c);
            else if (map.get(stack.removeLast()) != c)return false;
        }
        return stack.size() == 1;
    }
}

总结:K神的底子太好了,我看到的第一反应只是折半查找匹配。。。。。坚持记录一下

请登录后发表评论

    没有回复内容