算法萌新闯力扣:20.有效的括号

98 阅读1分钟

力扣热题:20.有效的括号

开篇

这道题读懂题目不难,就是些代码的时候,会发现需要判断的情况比较多

题目链接:20.有效的括号

题目描述

在这里插入图片描述

解题思路

1.利用哈希表map来匹配左右括号 2.创建list集合来保存左括号,如果出现右括号,则删除对应的左括号,如果没有对应的括号,则无效 3.如果最后list为空,则有效;如果不为空,则无效

代码纯享版

class Solution {
    public boolean isValid(String s) {
        if(s.length() % 2 != 0) return false;
        Map<Character, Character> map = new HashMap<>();
        map.put('(',')');
        map.put('{','}');
        map.put('[',']');
        List<Character> list1 = new ArrayList<>();
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') list1.add(s.charAt(i));
            else if(list1.size() != 0 &&map.get(list1.get(list1.size() - 1)) == s.charAt(i)){
                list1.remove(list1.size() - 1);
            }
            else return false;
        }
        if(list1.size() == 0) return true;
        else return false;
    }
}

其它解法

这种方法是的用栈来存储,由于只学了c的数据结构,java的数据结构还没学,所以没有使用

class Solution {
    private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
        put('{','}'); put('[',']'); put('(',')'); put('?','?');
    }};
    public boolean isValid(String s) {
        if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
        LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }};
        for(Character c : s.toCharArray()){
            if(map.containsKey(c)) stack.addLast(c);
            else if(map.get(stack.removeLast()) != c) return false;
        }
        return stack.size() == 1;
    }
}