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

76.最小覆盖子串

我的解法:

滑动窗口:

  • 使用map1记录子串t中各字符的出现频数,map2记录子串s的滑动窗口[left, right]中各字符的出现频数;
  • 当s[right]字符是所需字符时,即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 : "";
    }
};
相关推荐
洛水水1 分钟前
【力扣100题】24. 旋转图像
算法·leetcode
计算机安禾5 分钟前
【c++面向对象编程】第5篇:类与对象(四):赋值运算符重载
java·前端·c++
样例过了就是过了9 分钟前
LeetCode热题100 颜色分类
c++·算法·leetcode
ZPC821011 分钟前
C++ 跨平台 UDP 收发测试程序
c++·算法·机器人
hanbr15 分钟前
C++ 类型转换与异常处理全解析
开发语言·c++
ym_xixi16 分钟前
《类和对象》—— 构造函数与析构函数总结
前端·c++·算法
洛水水17 分钟前
【力扣100题】19. 排序链表 | 归并排序详解
算法·leetcode·链表
洛水水20 分钟前
【力扣100题】21. LRU 缓存
spring·leetcode·缓存
凯瑟琳.奥古斯特20 分钟前
丑数II C++三指针解法(力扣264)
数据结构·c++·算法·leetcode·职场和发展
YYYing.21 分钟前
【C++项目之高并发内存池 (四)】三层缓存的空间回收流程详解
c++·笔记·缓存·高并发·内存池