【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

在这里插入图片描述
送给大家一句话:

充满着欢乐与斗争精神的人们,永远带着欢乐,欢迎雷霆与阳光。 —— 赫胥黎

滑动窗口精通

  • 前言
  • Leetcode 30. 串联所有单词的子串
    • 题目描述
    • 算法思路
  • Leetcode 76. 最小覆盖子串
    • 题目描述
    • 算法思路
  • Thanks♪(・ω・)ノ 谢谢阅读!!!
  • 下一篇文章见!!!

前言

相信通过前两篇的文章的讲解,大家已经对滑动窗口有了较深的认识,今天我们来挑战一下!!!
来做两道困难级的题目。

Leetcode 30. 串联所有单词的子串

家人们!!!上链接!!!30. 串联所有单词的子串

题目描述

在这里插入图片描述
根据题目描述,这道题看起来很是复杂呢!?!?
我们要在一个字符串中寻找包含words的所有单词的子串,并会返回对应的开始位置(开始索引)。看这描述十分类似这道题目 438. 找到字符串中所有字母异位词 ,一个是寻找异位词,一个是寻找"异位单词串"。本质是十分相似的。
来看一个样例:

  • 输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]
  • 输出:[0,9]
  • 解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
    子串 “barfoo” 开始位置是 0。它是 words 中以 [“bar”,“foo”] 顺序排列的连接。
    子串 “foobar” 开始位置是 9。它是 words 中以 [“foo”,“bar”] 顺序排列的连接。
  • 输出顺序无关紧要。返回 [9,0] 也是可以的。

根据这样例,更容易想象为是如同字母一样。

算法思路

我们先把每个单词抽象为一个字母(方便我们梳理思路),我们只需要找到一个子串中有所有的“字母”即可。
那么,我们来看最简单的算法:暴力枚举。就是遍历所有的子串,以样例来说:

  1. bar foo the foo bar man (注意步长是单词的长度),从左到右依次遍历,寻找满足条件的子串。

  2. 我们来思考一下,当该躺不满足条件时:
    在这里插入图片描述

    很明显,无需把right重新移动的到left的位置重新开始,直接继续进行移动就可以。

  3. 所以此时构成滑动窗口的条件两个指针移动方向一致

那么我们就按照滑动窗口的解题模版来思考细节:

  • 进窗口
  • 判断
  • 出窗口
  • 更新结果(位置待定)

首先我们要解决的是个一般性问题:s 字符串的长度一定是单词的整数倍吗???
显然不是!
那么就要进行多次滑动窗口!保证可以遍历到所有可能的子串。那进行几次呢???
在这里插入图片描述

可以看出来只需要进行单词个数次的循环即可!!!再多就发生重复了!

这样大致的框架就有了,剩下的就是然后判断单词是否满足条件。
依旧时候使用哈希算法,利用无向图来模拟哈希表(string 映射 int)。

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        //预备工作
        //哈希表1
        unordered_map<string,int> hash1;
        for(auto ch : words) hash1[ch] ++; //对words进行处理
        // 基本变量
        int len = words[0].size(); //单词长度(步长) 
        int m = words.size();//单词个数
        int n = s.size();//字符串长度
        //答案
        vector<int> ans;
        //多次进行滑动窗口
        for(int i = 0;i < len;i++)
        {
            //哈希表2 用来进行比较
            unordered_map<string,int> hash2;
            //进窗口 注意一次移动的步长 注意结束条件(保证最后一个是完整单词,不然会发生越界)
            for(int left = i ,right = i ,count = 0; right + len <= n ; right += len )
            {
                string in = s.substr(right,len);
                //进窗口 维护count++ (有效单词数加一)
                if(++hash2[in] <= hash1[in])
                {
                    count++;
                }
                //判断是否超出长度
                if(right - left + 1 > m * len)
                {
                    string out = s.substr(left,len);
                    //出窗口 维护count
                    if(hash2[out]-- <= hash1[out]) count--;
                    left += len;
                }
                //满足条件  更新结果
                if(count == m)
                {
                    ans.push_back(left);
                }
            } 
        }
        return ans;
    }
};

我们提交:过啦!!!!

Leetcode 76. 最小覆盖子串

家人们!!! 上链接!!!76. 最小覆盖子串

题目描述

在这里插入图片描述
根据题目描述,我们需要再字符串中寻找能够覆盖 t 中所有字符的 最短子串,这个“覆盖”是包含 t 中的每个字母,不用管顺序。来看样例:

  • 输入:s = “ADOBECODEBANC”, t = “ABC”
  • 输出:“BANC”
  • 解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。

看了样例,应该就理解了这个“覆盖”:

  1. 对应字母个数必须大于等于 t 中字母个数
  2. 可以包含其它字母

算法思路

先来最直接的办法 — 暴力枚举,我们来看暴力算法是如何进行的:

  1. 首先找到一个包含于 t 的字母
  2. 然后从这个位置开始遍历
  3. 直到满足 t 中的每个字母都能在该子串中找到
  4. 然后再找到下一个包含于 t 的字母 重复 1 - 3

这样就完成了任务,那么如何进行优化呢???
根据暴力的步骤,我们可以看出来两个指针的移动方向是一致的,所以就可以进行滑动窗口算法了。
那么我们就按照滑动窗口的解题模版来思考细节:

  • 进窗口
  • 判断
  • 出窗口
  • 更新结果(位置待定)

这个判断要怎样进行判断???
肯定是使用哈希算法,但是如何保证对应字母个数必须大于等于 t 中字母个数呢???
这一步与之前的判断略有不同,因为我们可以多字母,来看代码:

class Solution {
public:
    string minWindow(string s, string t) {
    //滑动窗口 + 哈希算法
    
    //准备工作
    int kinds = 0; //字母种类 方便判断
    int hash1[128] = {0}; //哈希表1 因为只有使用数组比较方便
    //遍历所有字母 确定个数
    for (auto ch : t) 
        if (hash1[ch]++ == 0) kinds++;
    // 长度 
    int n = s.size();
    //哈希表2 用来比较
    int hash2[128] = { 0 }; 
    int begin = -1 ,minlen = INT_MAX;
    for(int left = 0,right = 0 ,count = 0;right < n;right++)
    {
        
        char in = s[right];
        //进窗口 维护count (对应字母相等时更新 保证满足条件 有效字母加一)
        if(++hash2[in] == hash1[in]) count++;
        //判断
        while(count == kinds)
        {
            //更新结果
            if(right - left + 1 < minlen)
            {
                minlen = right - left + 1;
                begin = left;
            }
            char out = s[left];
            //出窗口 维护count (相等时出窗口 有效字母减少)
            if(hash2[out]-- == hash1[out]) count--;
            left++;
        }
    }
    return begin == -1 ? "" : s.substr(begin,minlen);
    }
};

提交:过啦!!!!!!

经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!!
下面请大家继续刷题吧!!!

Thanks♪(・ω・)ノ 谢谢阅读!!!

下一篇文章见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/486864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WorkPlus AI助理,为企业提供智能化客户服务,助力企业发展与竞争力

在当今竞争激烈的商业环境中&#xff0c;提供优质高效的客户服务是企业取得成功的关键。而AI智能客服的崛起&#xff0c;以其卓越的性能和功能&#xff0c;助力企业提升客户服务体验。WorkPlus AI助理作为一款领先的解决方案&#xff0c;能够实现智能化客户服务&#xff0c;满足…

TTS通用播放库技术设计

TTS音频播放库技术设计 目录介绍 01.整体介绍概述 1.1 项目背景介绍1.2 遇到问题1.3 基础概念介绍1.4 设计目标1.5 问题答疑和思考 02.技术调研说明 2.1 语音播放方案2.2 TTS技术分析2.3 语音合成技术2.4 方案选择说明2.5 方案设计思路2.6 文本生成音频 03.系统TTS使用实践 3…

如何在CentOS7部署openGauss管理系统并实现固定公网地址连接

文章目录 推荐前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

抖音小店怎么做?起店流程大分享,可收藏!

大家好&#xff0c;我是电商糖果 会开店&#xff0c;但是不会起店。 这是不是很多电商商家遇到难题&#xff0c;尤其是刚开始做抖音小店的商家。 店开好几月也没有流量&#xff0c;不出单。 这里糖果就来分享一下&#xff0c;我这边自己总结的起店流程。 不敢自夸是最好的…

类和对象三部曲(one)

都说C语言是面向过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用来逐步解决问题。 拿洗衣服来举例&#xff0c;C关注的是一个过程&#xff1a; 那么C是什么呢&#xff1f; 面向对象的编程语言。 面向对象对象指什么&#xff1f; 象棋里的对象么&#xff1f;…

大模型时代5个最顶级的向量数据库

大家好&#xff0c;数字时代推动我们进入了由人工智能和机器学习为主导的时代&#xff0c;向量数据库已经成为存储、搜索和分析高维数据向量的不可或缺的工具&#xff0c;本文将介绍5个顶级的向量数据库。 1.Chroma 使用ChromaDB构建LLM应用程序 Chroma是开源嵌入数据库。Chr…

医疗行业对SDWAN专线的需求

随着信息技术的发展和医疗行业的数字化转型&#xff0c;SDWAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络解决方案&#xff0c;越来越受到医疗机构的重视和应用。医疗行业对SDWAN专线的需求主要体现在以下几个方面&#xff1a; 1、高度可靠的网络连接 医疗机构…

YOLOv9改进策略:卷积魔改 | DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测 | CVPR2024

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; DCNv4来自CVPR2024 的论文&#xff0c;它不仅收敛速度明显快于DCNv3&#xff0c;而且正向速度提高了3倍以上。这一改进使DCNv4能够充分利用其稀疏特性&#xff0c;成为最快的通用核心视觉算子之一。 改进结构…

CDP7 下载安装 Flink Percel 包

下载链接&#xff1a;https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本&#xff0c; 然后点击download now&#xff0c;会有一个协议&#xff0c;勾选即可&#xff0c;然后就有三个文件列表&#xff0c; 我这里是已经注册登录的状态&#xff0c;如果没…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

msvcp110.dll丢失修复办法

在计算机使用过程中&#xff0c;我们经常会遇到一些扩展名为.dll的文件&#xff0c;这些文件是动态链接库文件&#xff0c;用于提供程序运行时所需的函数和资源。其中&#xff0c;msvcp110.dll文件是一个非常重要的动态链接库文件&#xff0c;它属于Microsoft Visual C 2012 Re…

学习数据结构:算法的时间复杂度和空间复杂度

一、算法的复杂度 衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c;而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的…

Earth Hour地球一小时

在刚刚过去的周六&#xff08;2024-03-23&#xff09;是个特殊的日子&#xff0c;你知道是什么日子吗&#xff1f; 对&#xff0c;是地球一小时 活动日。 地球一小时”是让全球关心自然、热心环保的人可以共同发声的平台。 当地时间2024年3月23日晚8点30分&#xff0c;“地球…

【保姆级讲解Redis基础命令】

&#x1f308;&#x1f308;&#x1f308;个人主页:程序员不想敲代码啊&#x1f308;&#x1f308;&#x1f308; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c…

YZ系列工具之YZ09: VBA_Excel之读心术

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

全自动挂机引流,客户主动上门的秘密武器!

流量一直是各个行业的难题&#xff0c;无论在实体店还是在线行业。只有不断获取大量的流量&#xff0c;才能更好的进行商业变现和扩展。那么&#xff0c;有没有一款能实现全自动挂机引流的软件呢&#xff1f;答案是肯定的。下面就由我以自身的经验来介绍一下这款全自动挂机引流…

(bug2总结)-mysql 字段为varchar,用int去查的时候可能会多返回数据

场景&#xff1a;表结构和数据如下图 查询语句如下 总结&#xff1a; mysql 字段为varchar,用int去查的时候可能会多返回数据。mysql版本为5.7.4

混合像元分解:Matlab如何帮助揭示地表组成?

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

YOLOv9改进策略:IoU优化 | Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;Powerful-IoU更好、更快的收敛IoU&#xff0c;是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASCAL VOC数据集实现涨点 YO…