面试经典题---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 : "";
    }
};
相关推荐
GetcharZp17 小时前
C++ 程序员一定要会的 RPC 框架:gRPC 从原理到实战,一次写通服务端和客户端
c++·后端·grpc
CoovallyAIHub17 小时前
工业质检只能依赖缺陷样本?PatchCore给出“冷启动”答案
深度学习·算法·计算机视觉
.小墨迹17 小时前
cmake的add_definitions和target_compile_definitions使用
c++·学习·算法·ubuntu·机器学习
高洁0117 小时前
10分钟了解向量数据库(2)
深度学习·算法·机器学习·transformer·知识图谱
CSDN_RTKLIB17 小时前
【One Definition Rule】类重复定义解决思路
开发语言·c++
颜酱17 小时前
用填充表格法-吃透01背包及其变形
前端·后端·算法
C雨后彩虹17 小时前
简易内存池
java·数据结构·算法·华为·面试
Jacen.L17 小时前
SIGSEGV (11) 段错误详解
c++
2501_9411497918 小时前
面向微服务异步消息队列与可靠投递的互联网系统高可用设计与多语言工程实践分享
leetcode·决策树
天赐学c语言18 小时前
1.5 - 二叉树中的最大路径 && C++的类型转换
c++·算法·leecode