LeetCode刷题记录(二十一):有效的括号

325 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

有效的括号

image.png

题目解析

题目提供素材

本道题目提供的素材,只有一个字符串。

  1. 一个包含'(',')','{','}','[',']' 的字符串。

并且这个字符串中可能含有多组、多个相同符号。

我的解读

看到这道题,就会想到使用特殊的数据结构去实现是最好的。

但是往往很多人不能充分了解数据结构,我就是一个数据结构渣渣,所以我使用了硬性逻辑去解决了这个问题。

通过内置正向组合'(',')','{','}','[',']'。

反向组合')','(','}','{',']','['。

封装成两个Map,再通过两个中间值集合,分别是字符值Map,匹配值List。

具体的看一下解题思路吧。

解题思路

先内置参数zMap,fMap;

然后分隔字符串,进行对字符数组的循环遍历。

在遍历过程中,共有两大分支:

其一,正向字符,比如(、[、{

其二,反向字符,比如)、]、}

1.正向字符存储下来等待反向字符出现后合并。并且存储一个中间List,此list中存储的是相应反向字符合并的顺序。

注意:这里题目中需要考虑顺序,我前两次提交都没有考虑顺序,所以都提交失败了,大家不要忘了。

2.反向字符用来合并消除正向字符,就跟消消乐一样。

最后循环完成后,查看map集合中是否还存在没有消除的字符,如果有就返回false,如果没有就是true。

代码

执行代码如下,还是有优化空间的。

class Solution {
    public boolean isValid(String s) {
        if(s.length() % 2 != 0){
            return false;
        }
        Map<String,String> zMap = new HashMap<>();
        Map<String,String> fMap = new HashMap<>();
        zMap.put("(",")");
        fMap.put(")","(");
        zMap.put("{","}");
        fMap.put("}","{");
        zMap.put("[","]");
        fMap.put("]","[");
        Map<String,Integer> map = new HashMap<>();
        List<String> list = new ArrayList<>();
        String[] as = s.split("");
        for (String a : as){
            if(fMap.get(a) != null){
                Integer num = map.get(fMap.get(a));
                if(map.get(fMap.get(a)) == null){
                    return false;
                }else if(!a.equals(list.get(list.size()-1))){
                    return false;
                }else if(num <= 1){
                    map.remove(fMap.get(a));
                }else{
                    map.put(fMap.get(a), --num);
                }
                list.remove(list.size()-1);
            }else{
                Integer num = map.get(a);
                if(num != null){
                    map.put(a, ++num);
                }else{
                    map.put(a, 1);
                }
                list.add(zMap.get(a));
            }
        }
        return map.keySet().size() == 0;
    }
}

执行结果

执行结果图如下所示,此类问题很多人都在使用栈来解决,对有些初学者不是特别友好,所以使用了通俗的写法,不过效率堪忧。

image.png