ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 76. 最小覆盖子串

2020-05-23 16:58:43  阅读:226  来源: 互联网

标签:子串 map slow charAt ++ fast 76 length LeetCode


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了。

标签:子串,map,slow,charAt,++,fast,76,length,LeetCode
来源: https://www.cnblogs.com/ZJPaang/p/12943181.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有