面试经典题---76.最小覆盖子串

76.最小覆盖子串

我的解法:

滑动窗口:

  • 使用map1记录子串t中各字符的出现频数,map2记录子串s的滑动窗口left, right中各字符的出现频数;
  • 当sright字符是所需字符时,即t中该字符数量大于等于s的滑动窗口中这一字符的数量时,将match加1;
  • 当s的滑动窗口左端元素冗余时,直接将窗口向右收缩直至左端元素非冗余,得到的新滑动窗口仍满足包含t中所有字符(因为收缩的元素都是冗余元素);
  • 使用res记录s中涵盖t所有字符的最小子串;
  • 最后还有一步对match的判断,小于t.size()就代表s不存在涵盖所有t中字符的子串
cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size() < t.size()){
            return "";
        }
        string res = s;
        int left = 0, right = 0;
        int match = 0;
        unordered_map<char, int> map1, map2;
        for(auto ch : t){
            map1[ch]++;
        }
        while(right < s.size()){
            map2[s[right]]++;
            if(map1[s[right]] >= map2[s[right]]){
                match++;
            }
            while((left < right) && (map1[s[left]] < map2[s[left]])){
                map2[s[left++]]--;
            }
            if(match == t.size()){
                if(right - left + 1 < res.size()){
                    res = s.substr(left, right - left + 1);
                }
            }
            right++;
        }
        return match == t.size() ? res : "";
    }
};
相关推荐
通信仿真爱好者3 小时前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
AI科技星3 小时前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说4 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_4 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing5 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星5 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星5 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_105 小时前
【C++】013、空类占多少字节?
算法
Ricky_Theseus5 小时前
并查集:连通性问题
算法
Let's Chat Coding5 小时前
身份识别、身份认证与授权的区别
c++