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

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);
    }
}
相关推荐
和裕1 小时前
平口开槽箱 vs 飞机盒 vs 扣底盒:自动化、展示效果与成本核心区别
大数据·运维·网络·人工智能·算法·自动化
AgentMaster1 小时前
从售前到售后全链路覆盖:智能客服在企业 5 大场景的落地实践与工具选型
大数据·人工智能·算法
Cccp.1231 小时前
【leetcode】(六) 图和贪心算法
数据结构·算法·leetcode
y1su1 小时前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展
不会就选b9 小时前
算法日常・每日刷题--<贪心>14
算法
mmmmath_312 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
Navigator_Z12 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
醇氧13 小时前
MySQL 8.0 系统表损坏与引擎转换故障排查实战
数据结构·算法
大熊背13 小时前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(二)
算法·白平衡·色度·色温