首页 > 其他分享 >leetCode [76. Minimum Window Substring]

leetCode [76. Minimum Window Substring]

时间:2022-10-16 17:11:21浏览次数:65  
标签:字符 right 窗口 mapS Substring 76 Window mapT left

[76. Minimum Window Substring]

(https://leetcode.cn/problems/minimum-window-substring/)

image-20221016163525414

滑动窗口

  • 此题需要求s中包含t的最小字符串,运用滑动窗口可解

  • 定义:我们需要定义两个哈希表mapS和mapT,限制窗口左右的left和right,求得字符串的最小长度resultLength以及此字符串的开始位置start

  • 思路:

    • 通过移动right指针不断扩张窗口。当窗口包含t全部所需的字符后,若能收缩,则收缩窗口直到最小
    • mapT存储所有t字符,mapS每次循环判断当前这个字符在mapT中是否存在,存在则加入
    • check()判断窗口内是否含有t中全部字符,若含有则说明此窗口符合题目条件,再计算当前窗口长度是否小于resultLength,小于则更新resultLength和开始位置start
    • 收缩时,需要看left所指字符是否在t中,若存在--mapS[ s[ left ] ]
  • 实现:

    class Solution {
    public:
        string minWindow(string s, string t) {
            //s小于t则不可能符合题意
            if( s.size() < t.size() ) return "";
    
            //mapT存储所有t字符
            for( const auto& c : t )
            {
                ++mapT[c];
            }
    
            //扩张收缩窗口
            for( ; right < s.size(); ++right)
            {
    
                //判断当前这个字符在mapT中是否存在,存在则加入mapS
                if( mapT.find( s[right] ) != mapT.end() )
                {
                    ++mapS[s[right]];
                }
    
                //若当前窗口包含t所有字符
                while( check() && left <= right )
                {
                    
                    //判断是否更新开始位置和最小长度
                    if( right - left + 1 < resultLength )
                    {
                        resultLength = right - left + 1;
                        start = left;
                    }
    
                    //left所指字符是否在t中
                    if( mapT.find(s[left]) != mapT.end() )
                    {
                        --mapS[s[left]];
                    }
    
                    ++left;
                }
    
            }
    
            //若没有符合题意的字符串
            if(resultLength == INT32_MAX) return "";
    
            s = s.substr( start, resultLength );
            return s;
        }
    
        //判断当前窗口包含t所有字符
        bool check()
        {
            for( const auto& f : mapT )
            {
                if( mapS[ f.first ] < f.second )
                {
                    return false;
                }
            }
            return true;
        }
    
    private:
        unordered_map<char, int> mapS, mapT;
        int left = 0, right = 0;
        int resultLength = INT32_MAX, start = 0;
    };
    
    • 时间复杂度:O(n)

      空间复杂度:O(n)

标签:字符,right,窗口,mapS,Substring,76,Window,mapT,left
From: https://www.cnblogs.com/chenglixue/p/16796544.html

相关文章

  • 768. 忽略大小写比较字符串大小
    文章目录​​Question​​​​Ideas​​​​Code​​Question一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比......
  • Windows10系统命令行设置环境变量
    1.使用set临时设置环境变量用于设置临时环境变量。只在当前命令行窗口中有效。1.1cmd终端#如设置CLASSPATH$setCLASSPATH=D:\program\JavaTrainning\src#查看......
  • Windows查看并解除端口占用
    Windows查看并解除端口占用1.*查看被占用的端口1.*.&以管理员身份打开命令窗口win+r,输入cmd,调出dos窗口:1.*.&查找所有运行的端口查找所有运行的端口:点击查看代......
  • Exam Results Gym - 102769E
    https://vjudge.net/problem/Gym-102769E#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongll;......
  • C++ 实现随机数生成(Windows、Linux)
    1、简介计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生......
  • 内网KMS激活Windows OPENWRT
    电脑端配置首先,保证你的WINDOWS系统和OFFICE是VOL版的,这样才可以激活。WINDOWS系统除了旗舰版和家庭版都能激活。(我使用WIN10专业版)OFFICE2016在MSDN只有专业增强版,下......
  • Sentinel安装教程【Linux+windows】
    一、Sentinel的简介Sentinel是阿里巴巴出品的一款流控组件,它以流量为切入点,在流量控制、断路、负载保护等多个领域开展工作,保障服务可靠性。如果你学过netflix公司旗下......
  • 【LeetCode-769. medium】最多能完成排序的块
    ​​力扣​​ 解题报告:注意这种【根据一个要求,将数组分成多个区间】类模型的问题(比如汽车加油站、加法表达式求和),套路就这三步:1、初始化2、for循环或者while,里面三步  ......
  • Windows重装随记
    0.前情提要最近被人喊去修电脑,虽然计算机真的不是修电脑专业但还是去了。电脑表现为:打开任意一个文档,比如txt,doc,写点东西,保存,再打开,一定会变成乱码。经过若干次测试发现......
  • 【精品】windows下JDK1.8+MySQL8.X 安装运行 Seata1.5.2
    网上看到了很多seata的讲解,就我搜到的内容来看:要么是版本太低,要么是前置条件没有交待清楚,要么是讲解的不清不楚,为了节省同学们学习摸索的时间,所以写了该篇博客。环境Wind......