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

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中的字符可能会出现多次

所以我们应该判断的是字符的种类,即当hash1[in] == hash2[in]时,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);
    }
}
相关推荐
一碗白开水一32 分钟前
【第19话:定位建图】SLAM点云配准之3D-3D ICP(Iterative Closest Point)方法详解
人工智能·算法
编码浪子34 分钟前
趣味学RUST基础篇(函数式编程闭包)
开发语言·算法·rust
Want5951 小时前
C/C++圣诞树②
c语言·c++·算法
索迪迈科技2 小时前
算法题(203):矩阵最小路径和
线性代数·算法·矩阵
默默无名的大学生2 小时前
数据结构——链表的基本操作
数据结构·算法
Neverfadeaway2 小时前
C语言————冒泡排序(例题2)
c语言·数据结构·算法·冒泡排序·升序排列·降序排列
惊鸿.Jh2 小时前
1733. 需要教语言的最少人数
算法·leetcode
大千AI助手3 小时前
SPEA2多目标进化算法:理论与应用全解析
算法·多目标优化·种群·spea2·mop·moea·帕累托最优
AndrewHZ3 小时前
【图像处理基石】图像处理中的边缘检测算法及应用场景
图像处理·算法·计算机视觉·cv·算子·边缘检测
熊文豪4 小时前
【华为OD】区块链文件转储系统
算法·华为od·区块链