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

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);
    }
}
相关推荐
小O的算法实验室6 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
Tbisnic7 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx7 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归8 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing9 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习9 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨9 小时前
基础数论总结
笔记·学习·算法
夜不会漫长11 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng12 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背12 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline