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

        }
    }
相关推荐
罗西的思考22 分钟前
【OpenClaw】通过 Nanobot 源码学习架构---(5)Context
人工智能·算法·机器学习
惜茶37 分钟前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
Liudef061 小时前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
杰克尼1 小时前
springCloud_day07(MQ高级)
java·spring·spring cloud
OYpBNTQXi2 小时前
SEAL全同态加密CKKS方案入门详解
算法·机器学习·同态加密
NHuan^_^3 小时前
SpringBoot3 整合 SpringAI 实现ai助手(记忆)
java·人工智能·spring boot
蚂蚁数据AntData3 小时前
破解AI“机器味“困境:HeartBench评测实践详解
大数据·人工智能·算法·机器学习·语言模型·开源
ZC跨境爬虫3 小时前
Python异步IO详解:原理、应用场景与实战指南(高并发爬虫首选)
爬虫·python·算法·自动化
Mr_Xuhhh3 小时前
从ArrayList到LinkedList:理解链表,掌握Java集合的另一种选择
java·数据结构·链表
倦王3 小时前
力扣日刷47-补
python·算法·leetcode