Leetcode 76. 最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode)

class Solution {
    /**
    也是滑动窗口,思路简单,但实现起来容易出错。
    一个tmap记录目标串t的各个字符出现的次数;
    一个smap记录原串的某个滑动窗口里字符出现次数。
    两个指针left,right都从0开始,用right遍历原串s,
    如果smap包含了所有tmap的kv,那么肯定就匹配上了,
    这个时候呢,就更新left,进行++操作,每加一次,就看是不是不满足smap包含了所有tmap的kv,
    如果不满足就停止left的++。
     */
    public String minWindow(String s, String t) {
        if(s == null || t==null || s.length()==0 || t.length()==0){
            return "";
        }
        Map<Character,Integer> targetMap=new HashMap<>();
        // 这里其实也可以用charAt
        for(char c:t.toCharArray()){
            targetMap.put(c,targetMap.getOrDefault(c,0)+1);
        }
        int left=0,right=0;
        // t字符串里不同字符的数量
        int tCnt=targetMap.size();

        int sCnt=0;

        //Integer.MAX_VALUE
        int start=0,minLen=1000005;

        Map<Character,Integer> sMap=new HashMap<>();

        while(right<s.length()){
            char c=s.charAt(right);
            sMap.put(c,sMap.getOrDefault(c,0)+1);
            if(targetMap.containsKey(c) && sMap.get(c).intValue()==targetMap.get(c).intValue()){
                sCnt++;
            }

            // right-left-1,因为下标left到right之间字符串的长度范围是right-left+1,减去1等于t.length,这个长度才是真实的临界值
            while(sCnt==tCnt && right-left-1>=t.length()){
                char sc=s.charAt(left);
                if(right-left+1<minLen){
                    start=left;
                    minLen=right-left+1;
                }
                
                sMap.put(sc,sMap.get(sc)-1);
                left++;

                if(targetMap.containsKey(sc) && sMap.get(sc).intValue()<targetMap.get(sc).intValue()){
                // 说明匹配的子串字符种类数不一样了,left就不能再++了
                sCnt--;
                }
            }
            
            right++;
        }

        return minLen==1000005?"":s.substring(start,start+minLen);
    }
}

相关推荐

  1. leetcode 76. 覆盖

    2024-06-17 03:56:03       42 阅读
  2. LeetCode -- 76. 覆盖

    2024-06-17 03:56:03       19 阅读
  3. LeetCode 76 覆盖

    2024-06-17 03:56:03       18 阅读
  4. Leetcode 76. 覆盖

    2024-06-17 03:56:03       10 阅读
  5. LeetCode 76. 覆盖 滑动窗口框架

    2024-06-17 03:56:03       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 03:56:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 03:56:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 03:56:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 03:56:03       18 阅读

热门阅读

  1. 2024前端面试准备6-TS基础

    2024-06-17 03:56:03       7 阅读
  2. vue3 如何给表单添加表单效验+正则表达式

    2024-06-17 03:56:03       5 阅读
  3. LeetCode热题1. 两数之和

    2024-06-17 03:56:03       6 阅读
  4. git diff

    2024-06-17 03:56:03       8 阅读
  5. windows用脚本编译qt的项目

    2024-06-17 03:56:03       6 阅读
  6. Window上ubuntu子系统编译Android

    2024-06-17 03:56:03       6 阅读
  7. react捡起来了

    2024-06-17 03:56:03       6 阅读
  8. python判断一个数是不是偶数

    2024-06-17 03:56:03       9 阅读
  9. 编程机器人的参数表怎么看

    2024-06-17 03:56:03       6 阅读