力扣 hot100 最小覆盖子串 哈希表 滑动窗口 Java 题解

题目链接:76. 最小覆盖子串 - 力扣(LeetCode)

题目描述:

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

复制代码
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

复制代码
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

示例 3:

复制代码
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

我的思路:

先初始化一个字符计数的数组,记录t的不同字母个数的负数,初始化一个ansZ来记录种类数,接着定义一个l做窗口的左指针,sumW记录目前窗口满足t的种类,ansR和ansL分别记录最短字串的两边界,遍历s,如果字符计数数组当前字母的数量++后等于0代表找到了满足t某字母条件的数量,sumW种类++。如果sumW这个临时种类计数和ansZ一样,那么目前的窗口是满足t的字串,进行一个while循环尝试缩短窗口尽可能得到最短字串,先更新字串,目前的l-i小于ansR-ansL就更新ansR和ansL暂时为最短字串,如果当前l指向s的字母在字符计数数组中个数是0,也就是不能再缩短了,因为目前这里是符合位置的,所以从这里退出,sumW--,再继续判断下一次i的结果,如果没有退出while循环那么l--继续缩短窗口。

我的代码:

java 复制代码
class Solution {
        public String minWindow(String s, String t) {

            int sL = s.length();
            int tL = t.length();

            if(sL<tL){
                return "";
            }

            int[] ints = new int[128];
            int ansZ = 0;
            for (int i = 0; i < tL; i++) {
                if(ints[t.charAt(i)]==0){
                    ansZ++;
                }
                ints[t.charAt(i)]--;
            }

            int sumW = 0;
            int l = 0;
            int ansR = sL;
            int ansL = -1;

            for (int i = 0; i < sL; i++) {

                char c = s.charAt(i);
                ints[c]++;
                if(ints[c]==0){
                    sumW++;
                }

                while (sumW == ansZ){
                    if(i-l<ansR-ansL){
                        ansL = l;
                        ansR = i;
                    }

                    if(ints[s.charAt(l)]==0){
                        sumW--;
                    }

                    ints[s.charAt(l)]--;
                    l++;

                }

            }

            return ansL<0?"":s.substring(ansL,ansR+1);

        }
    }
相关推荐
机器人零零壹2 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
ZhengEnCi4 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt8 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
海的透彻8 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat8 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle