算法——滑动窗口之最小覆盖子串

8.最小覆盖子串

题目:. - 力扣(LeetCode)

我们很容易就能想到暴力解法,就是暴力枚举:

我们找到满足条件的这个子串后,就要将left++,然后right回到left的位置开始遍历,寻找下一个满足条件的子串,期间用哈希表来统计,判断是否满足条件

我们在暴力解法上进行优化:

(1)实际上当找到一个满足条件的子串后,right没必要回到left的位置,因为哈希表中已经存有left到right的信息

(2)left不只是简单的++,因为left++后,可能会出现2种情况:

①子串还是满足条件,那么left还要继续++,

②子串不满足条件,那么left不用在继续++

因此这种双指针同向运动的题目就是我们熟悉的滑动窗口

我们用in来表示进窗口的元素,out来表示出窗口的元素,hash1记录t中每个字符的个数,hash2记录窗口中每个字符的个数

(1)进窗口:hash2(in)++

(2)判断 :判断hash1和hash2中记录的字符情况是否一致,是的话更新结果,并出窗口

(3)出窗口:hash2(out)++

对于判断的优化:我们在前面的题目做过类似的判断优化方法,即用count来记录有效字符的个数

但是在这道题中两个哈希表不是简单的一一对应的关系,hash2中的字符可能会出现多次

所以我们应该判断的是字符的种类,即当hash1in == hash2in时,count++;而用kinds记录t中字符的种类,当kinds == count时,更新条件

题解:

java 复制代码
class Solution {
    public static String minWindow(String s, String t) {
        int[] hash2 = new int[80];
        int[] hash1 = new int[80];
        int kinds = 0;
        for(char c : t.toCharArray()){
            if(hash1[c - 'A']++ == 0){
                kinds++;
            }
        }

        int minLen = s.length() + 1;
        int len = s.length();
        int begin = -1;
        for(int left = 0,right = 0,count = 0;right < s.length();right++){
            char in = s.charAt(right);
            hash2[in - 'A']++;
            if(hash2[in - 'A'] == hash1[in - 'A']){
                count++;
            }
            while(count == kinds && left <= right){
                int tmp = right - left + 1;
                if(tmp < minLen){
                    begin = left;
                    minLen = tmp;
                }
                char out = s.charAt(left);
                if(hash2[out - 'A'] == hash1[out - 'A']){
                    count--;
                }
                hash2[out - 'A']--;
                left++;
            }
        }
        return minLen == s.length()+1 ? "" : s.substring(begin,begin+minLen);
    }
}
相关推荐
大鱼>19 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
c2385620 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp21 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室21 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
冻柠檬飞冰走茶21 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_21 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔21 小时前
算法练习5
算法·代理模式
问商十三载21 小时前
RAG 检索召回越多越好?2026 信噪比模型深度解析
人工智能·算法·机器学习
额恩6621 小时前
ResearchPilot 第三阶段总结报告
python·算法
Hi李耶21 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展