LeetCode20.有效的括号

LeetCode20.有效的括号

题目描述

/**
     * 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
     * <p>
     * 有效字符串需满足:
     * <p>
     * 左括号必须用相同类型的右括号闭合。
     * 左括号必须以正确的顺序闭合。
     */

思路分析

1.由题目要求,左括号必须由相同类型的右括号并以正确的顺序闭合,可以马上联想到栈

2.由于栈的先进后出特性,可以先让后入栈的左括号与先拿到的右括号进行比较并判断

3.判断条件,如果拿到右括号,而栈是空的,则不能匹配,或者拿到右括号,栈顶的元素即左括号和右括号不能匹配,则返回false

4.因为要判断字符串的每一个字符是左括号还是右括号,因为要先建立包含这几种括号的集合,由左右括号立刻联想到基于键值对存储的Hashmap,此集合也可以通过键获取值,在使用中可提供很大的便利

5.遍历字符串,然后将拿到的每一个字符和Hashmap集合中的元素对比,判断是左括号还是右括号

  1. 创建元素基于先进后出特性的栈Stack,遍历字符串,如果拿到的是左括号,则入栈,如果是右括号,则判断并出栈
  2. 遍历结束后,如果栈是空的,则说明所有的左右符号都能匹配,如果不为空,则说明有多余的括号没有匹配

源码

public static boolean isValid(String s) {
        //拿到字符串的长度,并判断如果字符串的长度为奇数,则直接返回false
        int len = s.length();
        if (len % 2 != 0) {
            return false;
        }
        //将左右括号先存储到HashMap双列集合
        HashMap<Character, Character> map = new HashMap<>();
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');
        //基于栈的先进后出特性
    	//测试
        //String str = "()[]{}";
        Stack<Character> stack = new Stack<>();
        //栈中存储左括号
        for (int i = 0; i < len; i++) {
            //拿到每一个字符
            char c = s.charAt(i);
            //如果拿到的字符是左括号
            if (map.containsValue(c)){
                //左括号入栈
                stack.push(c);
            }else {//如果是右括号
                //拿到右括号,并且栈是空的,则不能匹配
                if (stack.isEmpty()){
                    return false;
                }
                //拿到右括号,但是和栈的顶部字符不匹配
                if (stack.peek() != map.get(c)){
                    return false;
                }
                //左括号出栈
                stack.pop();
            }
        }
    	//返回的是最后栈是否为空
        return stack.isEmpty();
    }

posted @ 2021-04-29 16:19  mx_info  阅读(55)  评论(0)    收藏  举报