当前位置: 首页 > news >正文

leetcode 76. 最小覆盖子串

题目如下
在这里插入图片描述

数据范围
在这里插入图片描述

首先本题可以利用不定长的滑动窗口思想不断枚举右端同时检查窗口是否符合题意。
但是这样做每次新枚举一个窗口都要检查造成了很多重复计算。
我们发现其实每次变化要么是少一个字符要么是多一个字符而中间的根本没变。
所以,我们令字符串t出现的字符种类为m,
在枚举右端点的过程中每当窗口内的某个字符出现频率增加到与字符串t一样时count++。
在m == count时我们会发现此时答案可能出现在窗口内,
所以我们不断移动左端点同时减少对应的字符的频数当这个频数小于t中的频数时显然我们不能移动左端点了。
在这个过程中不断得到最小长度以及子串起始地址然后返回即可。

未优化通过代码

class Solution {
public:
    bool check() {
        for (auto& p : mapt) {
            if (maps[p.first] < p.second)
                return false;
        }
        return true;
    }
    unordered_map<char, int> mapt, maps;
    string minWindow(string s, string t) {
        int n = s.size();
        int m = t.size();
        if (m > n)
            return "";

        for (char c : t)
            mapt[c]++;

        int l = 0, r = 0;
        int ans = INT_MAX;
        int st = 0;
        while (r <= n) {
            if (mapt.count(s[r])) {
                maps[s[r]]++;
            }
            r++;
            
            while (l <= r && check()) {
                if (r - l < ans) {
                    ans = r - l;
                    st = l;
                }

                if (mapt.count(s[l])) {
                    maps[s[l]]--;
                }
                l++;
                
            }
        }

        return ans == INT_MAX ? "" : s.substr(st, ans);
    }
};

在这里插入图片描述

优化后的通过代码

class Solution {
public:
    bool check() {
        for (auto& p : mapt) {
            if (maps[p.first] < p.second)
                return false;
        }
        return true;
    }
    unordered_map<char, int> mapt, maps;
    string minWindow(string s, string t) {
        int n = s.size();
        int m = t.size();

        if (m > n)
            return "";
        int count = 0;
        for (char c : t)
            mapt[c]++;
        m = mapt.size();
        int l = 0, r = 0;
        int ans = INT_MAX;
        int st = 0;
        while (r <= n) {
            if (mapt.count(s[r])) {
                maps[s[r]]++;
               // cout << maps[s[r]] << endl;
                if (maps[s[r]] == mapt[s[r]]) {
                    count++;
                }
                
                while (l <= r && count == m) {
                    //       cout << r << endl;
                    if (r - l + 1 < ans) {
                        ans = r - l + 1;
                        st = l;
                    }

                    if (mapt.count(s[l])) {
                        maps[s[l]]--;
                        if (maps[s[l]] < mapt[s[l]]) {
                            l++;
                            count--;
                            break;
                        }
                    }
                    l++;
                }
            }
            r++;
        }
        //  cout << ans;
        return ans == INT_MAX ? "" : s.substr(st, ans);
    }
};

在这里插入图片描述

相关文章:

  • Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统
  • 爬虫系列之【数据解析之正则】《二》
  • 神经网络之CNN文本识别
  • LeetCode 热题100 3. 无重复字符的最长子串
  • LabVIEW DataSocket 通信库详解
  • 基于DeepSeek 的图生文最新算法 VLM-R1
  • Go开发框架Sponge+AI助手协同配合重塑企业级开发范式
  • 论文阅读:CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION?
  • 【C语言显示Linux系统参数】
  • c++面试常见问题:虚表指针存在于内存哪个分区
  • LeetCodehot 力扣热题100 组合总和
  • 【C】初阶数据结构8 -- 链式二叉树
  • 计算机毕业设计SpringBoot+Vue.js人力资源管理系统(源码+文档+PPT+讲解)
  • MCP与RAG:增强大型语言模型的两种路径
  • 【算法】【并查集】acwing算法基础837. 连通块中点的数量
  • 每日一题——接雨水
  • 制作安装win10系统U盘详细步骤
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令
  • 【C++并发编程实战】第1章 你好,C++的并发世界!
  • Golang语言特性
  • 顶刊论文现“飙脏话辱骂第二作者”,期刊回应:正积极调查
  • 中信银行资产管理业务中心原副总裁罗金辉一审被控受贿超4437万
  • 长沙至赣州高铁初步设计获批,可填补湘赣两省斜向交通空白
  • 上海将建设万兆小区、园区及工厂,为模型训练数据的传输提供硬件支持
  • 芬兰直升机相撞坠毁事故中五名人员全部遇难
  • 新华时评:博物馆正以可亲可近替代“高冷范儿”