当前位置: 首页 > news >正文

算法016——最小覆盖子串

力扣——最小覆盖子串(点击跳转)
在这里插入图片描述
分析题目
在这里插入图片描述
我们先随便从一个位置开始,让 right 右移,直到找到符合题目的位置停下
在这里插入图片描述
之后,让 left 右移,此时会出现两种情况

  1. 仍然符合要求,right 不需要动
  2. 不符合要求,此时让 right 右移,知道找到符合要求的位置

所以我们使用滑动窗口 + 哈希表的方式来解决此问题。

此时,窗口满足出窗口,让 left 右移
在这里插入图片描述

  1. left = 0,right = 0
  2. 进窗口: hash2[in]++
  3. 判断:check(hash1,hash2)
    更新结果:起始位置,最短长度
    出窗口:hash2[out]–

跟上两篇博客一样,我们可以对判断条件做出优化
前两篇博客找到字符串中所有的字母异位词

定义一个变量 count 表示有效字符的种类

进窗口,要在相等的时候比较,相等说明此时进窗口的字符为有效字符,之后让 count++,如果按照上一道题,大于等于来比较的话,会有重复
在这里插入图片描述

出窗口时,加入 left 与 right 在如图所示的位置上,我们要在出窗口之前判断,等于说明出窗口的为有效字符,让 count–

最后判断 count 是否等于 hash1的长度

  1. 进窗口:hash2[in] == hash1[in] ——> count++
  2. 出窗口:hash2[out] == hash1[out] ——> count–
  3. 判断条件: count == hash1.size()

代码如下:

class Solution {
    public String minWindow(String s, String t) {
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        int[] hash1 = new int[128];
        int kind = 0;//用于统计 t 字符串中的字符种类的个数
        for(char ch : t1){
            if(hash1[ch]++ == 0){
                kind++; 
            }
        } 
        int[] hash2 = new int[128];
        int minlen = Integer.MAX_VALUE;
        int begin = -1;
        for(int left = 0,right = 0,count = 0;right < s1.length;right++){
            char in = s1[right];
            if(++hash2[in] == hash1[in]){
                count++;  
            }
            while(kind == count){
                if(right - left + 1 < minlen){
                    begin = left;
                    minlen = right - left + 1;
                }
                char out = s1[left++];
                if(hash2[out]-- == hash1[out]){
                    count--;
                }
            }
        }
        if(begin == -1){
            return new String();
        }else{
            return s.substring(begin,begin + minlen);
        }
    }
}

完成了,我要累死了,休息
在这里插入图片描述

相关文章:

  • 209、不大于n的数的组合(python)
  • Linux(8.4)NFS
  • 一、串行通信基础知识
  • Dufs 文件共享系统,内部文件共享还在用ftp\samba?
  • 100. 岛屿的最大面积
  • Linux安装MySQL5.7.26教程图解
  • 蓝桥杯好题推荐---二位前缀和
  • Flask多参数模版使用
  • AI:Machine Learning Data Science
  • 稳定运行的以PostgreSQL数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 图解AUTOSAR_CP_NetworkManagementInterface
  • 人工智能之数学基础:从线性变换理解矩阵范数和矩阵行列式
  • JavaScript 中的包装类型:概念、作用与使用场景
  • spring启动流程
  • 集成学习(上):Bagging集成方法
  • C# ManualResetEvent‌的高级用法
  • Pytorch学习笔记
  • 书摘 ASP.NET Core技术内幕与项目实战:基于DDD与前后端分离
  • 案例驱动的 IT 团队管理:创新与突破之路:第二章 团队组建:从人才画像到生态构建-2.2.1星型架构 vs 网状架构对比
  • 华为中小型企业项目案例
  • 7月打卡乐高乐园,还可以去千年古镇枫泾参加这个漫画艺术季
  • 《致1999年的自己》:千禧之年的你在哪里?
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 巴基斯坦外长:近期军事回应是自卫措施
  • 罕见沙尘再度入川,官方:沙尘传输高度达到平流层,远超以往
  • 人民财评:网售“婴儿高跟鞋”?不能让畸形审美侵蚀孩子身心