leetcode76.最小覆盖子串

思路源于

【小白都能听懂的算法课】【力扣】【LeetCode 76】最小覆盖子串|滑动窗口|字符串

初始化先创建t的哈希表记录t中的字符以及它出现的次数,t的have记录t中有几种字符

s的哈希表记录窗口中涵盖t的字符以及它出现的次数,初始化时出现次数全部为0,s的have记录s中有几种字符已经覆盖了t中的字符

先滑动右指针扩大窗口,只要遇到t中有的字符,就让s哈希表对应字符出现次数+1,直到s能覆盖t(sHave==tHave时),这时就要记录下这个窗口(也就是可能是最终结果的子串)的起始位置和终止位置,并且不断将左指针移动缩小窗口,如果碰到t中存在的字符那么就要让s哈希表对应字符出现次数-1,直到s刚好不能覆盖t(sHave==tHave-1时)。不断重复这个过程直到滑动窗口边界越出就结束了

java 复制代码
class Solution {
    public String minWindow(String s, String t) {
        int sStart = 0, sEnd = s.length();
        int sHave = 0, tHave = 0;
        Map<Character, Integer> sMap = new HashMap<>();
        Map<Character, Integer> tMap = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            char charAt = t.charAt(i);
            if (!tMap.containsKey(charAt)) {
                tHave++;
                tMap.put(charAt, 1);
                sMap.put(charAt, 0);
            } else {
                tMap.put(charAt, tMap.get(charAt) + 1);
            }
        }
        for (int right = 0, left = 0; right < s.length(); right++) {
            if (tMap.containsKey(s.charAt(right))) {
                char charAtRight = s.charAt(right);
                sMap.put(charAtRight, sMap.get(charAtRight) + 1);
                //若是刚好新增某个字符达到和t中字符数量一致的情况,则认为s中这个字符刚好覆盖
                if (sMap.get(charAtRight).equals(tMap.get(charAtRight))) {
                    sHave++;
                }
                while (sHave == tHave) {
                    //更新结果子串的开始索引和结束索引
                    if (right - left < sEnd - sStart) {
                        sStart = left;
                        sEnd = right;
                    }
                    char charAtLeft = s.charAt(left);
                    if (tMap.containsKey(charAtLeft)) {
                        sMap.put(charAtLeft, sMap.get(charAtLeft) - 1);
                        //若是刚好删除某个字符导致t中这个字符无法覆盖s中的这个字符
                        if (sMap.get(charAtLeft).equals(tMap.get(charAtLeft) - 1)) {
                            sHave--;
                        }
                    }
                    left++;
                }
            }
        }
        return sEnd == s.length() ? "" : s.substring(sStart, sEnd + 1);
    }
}
相关推荐
蒙奇D索大5 分钟前
【算法】回溯算法精讲:从深度优先搜索到剪枝优化
经验分享·笔记·算法·深度优先·剪枝·改行学it
QTreeY1235 分钟前
yolov5/8/9/10/11/12/13+deep-oc-sort算法的目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
_OP_CHEN8 分钟前
算法基础篇:(六)基础算法之双指针 —— 从暴力到高效的优化艺术
c++·算法·acm·优化算法·双指针·oj题·算法蓝桥杯
cs麦子11 分钟前
C语言--详解--指针--下
c语言·数据结构·算法
Han.miracle14 分钟前
Java EE --JUC
java·线程池·原子类·callable·semaphore·reentrantlcok
那我掉的头发算什么15 分钟前
【javaEE】多线程——线程安全初阶☆☆☆
java·jvm·安全·java-ee·intellij-idea
flashlight_hi17 分钟前
LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点
javascript·数据结构·leetcode·链表
yzp-32 分钟前
Zookeeper 笔记
java·分布式·zookeeper
Tisfy35 分钟前
LeetCode 2536.子矩阵元素加 1:二维差分数组
算法·leetcode·矩阵
蜡笔大新79843 分钟前
IDEA中的异常
java·ide·intellij-idea