复习Day03:数组part03:76 . 最小覆盖子串、438. 找到z字符串z中所有字母异位词

news2024/11/20 10:35:35

之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131700482?spm=1001.2014.3001.5501

我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带模拟面试环境。

76 . 最小覆盖子串

leetcode链接:https://leetcode.cn/problems/minimum-window-substring/?envType=study-plan-v2&envId=top-100-liked

给你一个字符串 s 、一个字符串 t 。
返回 s 中涵盖 t 所有字符的最小子串。
如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

 

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
 

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A''B''C'。
示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。
示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

这题的意思就是在s中找到含有t所有字母的最小长度的子串。滑动窗口的思路是这样:

1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引左闭右开区间 [left, right) 称为一个「窗口」。

2、我们先不断地增加 right 指针扩大窗口 [left, right),直到窗口中的字符串符合要求(包含了 T 中的所有字符)。

3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right),直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。

最终代码:

class Solution {
public:
    string minWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;

    int left = 0, right = 0;
    int valid = 0;
    // 记录最小覆盖子串的起始索引及长度
    int start = 0, len = INT_MAX;
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 扩大窗口
        right++;
        // 进行窗口内数据的一系列更新
        if (need.count(c)) {
            window[c]++;
            if (window[c] == need[c])
                valid++;
        }

        // 判断左侧窗口是否要收缩
        while (valid == need.size()) {
            // 在这里更新最小覆盖子串
            if (right - left < len) {
                start = left;
                len = right - left;
            }
            // d 是将移出窗口的字符
            char d = s[left];
            // 缩小窗口
            left++;
            // 进行窗口内数据的一系列更新
            if (need.count(d)) {
                if (window[d] == need[d])
                    valid--;
                window[d]--;
            }                    
        }
    }
    // 返回最小覆盖子串
    return len == INT_MAX ?
        "" : s.substr(start, len);
}

};

438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。
不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

 

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

这里差一个unordered_map查找键值对时,find和count的区别:find一般需要获取具体指,count则着重于判断在不在。

image

image

最终代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;

    int left = 0, right = 0;
    int valid = 0;
    vector<int> res; // 记录结果
    while (right < s.size()) {
        char c = s[right];
        right++;
        // 进行窗口内数据的一系列更新
        if (need.count(c)) {
            window[c]++;
            if (window[c] == need[c]) 
                valid++;
        }
        // 判断左侧窗口是否要收缩
        while (right - left >= t.size()) {
            // 当窗口符合条件时,把起始索引加入 res
            if (valid == need.size())
                res.push_back(left);
            char d = s[left];
            left++;
            // 进行窗口内数据的一系列更新
            if (need.count(d)) {
                if (window[d] == need[d])
                    valid--;
                window[d]--;
            }
        }
    }
    return res;
}

};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PY32F003F18之窗口看门狗

一、PY32F003F18窗口看门狗特点&#xff1a; 即使窗口看门狗被禁止&#xff0c;窗口看门狗的"递减计数器"也会继续递减计数。 二、窗口看门狗复位的条件&#xff1a; 1、将"控制寄存器WWDG_CR"中的WDGA1,激活"窗口看门狗计数器等于0x3F"时,则产…

次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)

如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f; 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f;1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑…

Unity3D 简易音频管理器

依赖于Addressable 依赖于单例模板&#xff1a;传送门 using System.Collections.Generic; using System.Security.Cryptography; using System; using UnityEngine; using UnityEngine.AddressableAssets;namespace EasyAVG {public class AudioManager : MonoSingleton<…

2023第十二届中国智能产业高峰论坛之文档大模型的探索与思考

文章目录 前言合合信息多模态大模型与文档图像智能理解文档图像分析识别与理解的技术难题文档图像分析与预处理文档解析与识别版面分析与还原文档信息抽取与理解AI安全知识化&存储检索和管理 文档图像的分析识别与理解和大模型的关系文档图像大模型的进展LayoutLMUDOPDonut…

科技云报道:勒索金额再创新高,企业应如何防范?

科技云报道原创。 今年上半年的数据表明&#xff0c;勒索软件活动和赎金金额有望创下历史新高。 Check Point Research在《2023 年年中安全报告》中指出&#xff0c;今年上半年&#xff0c;随着新的勒索软件团伙不断涌现&#xff0c;勒索软件攻击态势持续升级。 区块链分析公…

【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;LCD1604显示传感器检测的温湿度、光线强度和风速&#xff0c;工作模式&#xff0c;以及相应阈值&#xff0c;系统工作状态等&#xff1b;系统默认为自动模式&#xff0c; 可通过K4…

企业如何寻找适合的CRM系统软件

在数字化转型步伐不断加快的今天&#xff0c;CRM软件成为企业必不可少的一项工具。如果您并不清楚如何寻找合适的CRM系统软件&#xff1f;不妨通过下列几点来寻觅。 1.根据CRM系统行业和类别 例如企业重视营销功能&#xff0c;搜寻营销型CRM软件&#xff1b; 企业希望梳理好…

ideogram.ai 不同风格的效果图

https://ideogram.ai/ 提示词&#xff1a; French bulldog with sunglasses, playing skateboarding, speed up, happiness, front viewPhoto 相片 正常照片 Poster 海报 偏绘画&#xff0c;清晰的勾线 3D Render 3D 渲染 胶质感&#xff0c;像 3D 模型 Typography …

王珊教授:坚定信念走自主可控之路

在人大金仓2023新品发布会上&#xff0c;我国数据库泰斗、CCF最高科学技术奖获得者、原人民大学信息学院院长、原中国计算机学会&#xff08;CCF&#xff09;副理事长、人大金仓首任董事长王珊教授发表了致辞。 去年&#xff0c;王珊教授同样见证了人大金仓KESV9产品的发布。一…

氨基酸代谢:从基础到应用,揭示其在健康与疾病的角色

氨基酸(Amino Acid, 简称AA ) 是蛋白质合成的基石。它们是正常细胞生长、分化和功能所必需的细胞结构元素和能量来源。 蛋白质是长链氨基酸。人的身体有数千种不同的蛋白质&#xff0c;每种蛋白质都有重要的作用。每种蛋白质都有自己的氨基酸序列。该序列使蛋白质呈现不同的形状…

freemarker自定义模板

模板编程器指南 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version> </dependency>freemarker官网参考&#xff1a; https://freemarker.apache.org/docs/pgui_qu…

C# OpenCvSharp Yolov8 Cls 图像分类

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenC…

【OpenPLC学习】RK3568上运行OpenPLC

1 下载Runtime源码 git clone https://github.com/thiagoralves/OpenPLC_v3.git2 安装程序 ./install.sh linux3 在RK3568上运行Runtime sh start_openplc.sh4 在windows网页端登录 账号&#xff1a;openplc 密码&#xff1a;openplc 6 下载OpenPLC Editor https://git…

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作想象和世界一样宽广

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作想象和世界一样宽广

防火墙旁挂、和热备

旁挂 拓扑 防火墙配置 interface GigabitEthernet0/0/0 undo shutdown ip binding vpn-instance default ip address 172.25.254.2 255.255.255.0 alias GE0/METH service-manage http permit service-manage https permit service-manage ping permit service-manage…

由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题的”修复方案

在Windows操作系统中&#xff0c;msvcp140.dll是一个非常重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件主要用于支持许多应用程序的正常运行&#xff0c;例如Microsoft Office、SQL Server等。当计算机上缺少msvcp140.dll文…

网络编程-TCP协议(客户端和服务端)

需要了解UDP协议的&#xff0c;可以看往期文章 https://flypeppa.blog.csdn.net/article/details/133273416 TCP/IP参考模型 代码案例 服务端代码 package com.hidata.devops.paas.udp;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

tomcat在idea上的配置

tomcat在idea上的配置主要包含以下几个步骤&#xff1a; 1、创建一个maven web工程 2、配置tomcat 1、创建一个maven web工程 第一个是仓库配置文件的路径&#xff0c;第二个是你的仓库路径。 2、配置tomcat 配置tomcat有以下两种方式&#xff1a; 1、集成配置 2、插件配置…

Unity 制作登录功能01-创建登录的UI并获取输入内容

1.创建UI面板 导入插件TextMesh Pro 2.编写脚本获取用户输入 这里用的是输入框侦听函数&#xff0c;所有UI都可以使用侦听函数 &#xff0c;需要注意TMP_InputField 这个类是UI中导入的一个插件TextMesh Pro&#xff01;在代码中需要引用using TMPro; 命名空间&#xff01; …

9月25日学习记录

1. vs中Qt添加模块在这个位置&#xff1a; VS2019 Qt 怎么添加Qt模块&#xff1f;_qtvs添加第三方qt模块_令狐掌门的博客-CSDN博客 2.布局学习 (1) QVBoxLayout *layoutnew QVBoxLayout(this);QWidget *w1new QWidget;QWidget *w2new QWidget;w1->setStyleSheet("bac…