力扣 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);

        }
    }
相关推荐
oem1102 小时前
C++与Docker集成开发
开发语言·c++·算法
自信150413057592 小时前
数据结构初阶之二叉树收尾
c语言·数据结构·算法
季远迩2 小时前
240. 搜索二维矩阵 II(中等)
人工智能·算法·矩阵
SimonKing2 小时前
AI时代,一个Skill如何让Java项目结构自动化?
java·后端·程序员
xushichao19892 小时前
C++中的享元模式
开发语言·c++·算法
闻哥2 小时前
MySQL三大日志深度解析:redo log、undo log、binlog 原理与实战
android·java·jvm·数据库·mysql·adb·面试
tankeven2 小时前
HJ133 隐匿社交网络
c++·算法
indexsunny2 小时前
互联网大厂Java面试实战:从Spring Boot到微服务架构的音视频场景解析
java·spring boot·spring cloud·mybatis·spring security·jwt·flyway
spring2997922 小时前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端