zoukankan      html  css  js  c++  java
  • LeetCode 76. 最小覆盖子串

    https://leetcode-cn.com/problems/minimum-window-substring/

    很典型的滑动窗口题,但是有隐藏了很多的杀机。先上代码吧。

    class Solution {
       public String minWindow(String s, String t) {
            if(s.length() < t.length() || s.length() == 0 || t.length() == 0){
                return "";
            }
            HashMap<Character,Integer> map = new HashMap<>(t.length());
            int fast = 0;
            int slow = 0;
            int i = 0;
            String res = "";
            int length = Integer.MAX_VALUE;
            int count = 0;
            for(; i < t.length(); i++){
                map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) +1);
            }
            while(fast < s.length()){
                if(map.containsKey(s.charAt(fast))){
                    map.put(s.charAt(fast), map.get(s.charAt(fast)) -1);
                    if(map.get(s.charAt(fast)).equals(0)){
                        count++;
                    }
                    while (count == map.keySet().size()){
                        if((fast - slow + 1) < length){
                            length = fast - slow + 1;
                        }
                        if(map.containsKey(s.charAt(slow))){
                            map.put(s.charAt(slow), map.get(s.charAt(slow)) + 1);
                            if(map.get(s.charAt(slow)).intValue() > 0){
                                count--;
                            }
                        }
                        slow++;
                    }
                    if(length != Integer.MAX_VALUE && length != res.length()){
                        res = s.substring(fast - length + 1, fast+1);
                    }
                }
                fast++;
            }
            return res;
        }
    }

    其实很好理解,先map统计完字符串t中每个字符出现的个数,然后主循环中,如果出现某个字符的个数变成 0,那么它就会满足原来的字符串的其中一个字符条件,所以count++。

    如果满足了字符串t中所有的不同字符的情况下,就开始从左手边缩窄滑动窗口,假如遇到其中一个缩窄后个数变成大于0的情况,说明已经出现了不匹配的情况 ,结束循环。

    在做完上面这个循环后,再去把我们得到的最小字符串给截取出来,然后快指针++。

    这个题坑在哪里呢,leetcode最后两个测试用例规模爆炸,map中存的是对象Integer而不是int,每次比较的时候都会新建一个对象导致最后两个测试用例TLE,这里需要把拆箱利用Java的缓存才能勉强过了。

    其实最开始我都没有利用count这个变量。。直接每次循环都检查整个map的所有value是否大于0,如果是就直接不做循环,这样的恶果是导致直接在倒数第二个测试用例中TLE,拆箱再比较还是T了。

  • 相关阅读:
    SQL 学习随笔
    hibernate查询方式总结基于原生SQL查询(二)
    hibernate查询方式总结(四)之QBC,QBE查询
    Hibernate查询方式汇总之Hql查询(三)
    java 强引用,软引用,弱引用,虚引用
    JAVA-对java平台的理解
    Git SSH本机配置
    Windows下Python3解决 Microsoft Visual C++ 14.0 is required 报错
    checkpoint原理剖析与源码分析
    CacheManager原理剖析与源码分析
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/12943181.html
Copyright © 2011-2022 走看看