算法练习题10:leetcode76最小覆盖子串-滑动窗口

目录


题目

题目描述

约束条件

解决思路

代码

getOrDefault(c, 0) 方法

方法签名

参数

返回值

示例

getOrDefault 与 get 的主要区别

Integer 


题目

题目描述

给定两个字符串 st,请你在字符串 s 中找到包含 t 中所有字符的最小子串。

要求:

        如果 s 中存在这样一个子串,返回这个最小子串。

        如果不存在这样的子串,则返回空字符串 ""

注意:

        如果 s 中存在多个符合条件的子串,返回长度最小的那个。

  t 中的字符可以在子串中以任何顺序出现,但每个字符的出现次数必须与 t 中相同或更多。

输入: s = "ADOBECODEBANC", t = "ABC"
输出: "BANC"
解释: "BANC" 是包含 "ABC" 的最小子串。
输入: s = "a", t = "a"
输出: "a"
解释: 子串 "a" 自身就是满足条件的最小窗口。
输入: s = "a", t = "aa"
输出: ""
解释: 因为 "a" 中只包含一个 "a",不满足 "t" 中两个 "a" 的条件,因此返回空字符串。

约束条件

  s 和 t 的长度均不会超过 10^5。

       字符串 s 和 t 由英文字母组成。

解决思路

这道题可以使用滑动窗口的技巧来解决:

  1. 初始化:使用两个字典,一个存储目标字符串 t 中各字符的计数,一个存储当前窗口中各字符的计数。
  2. 扩展窗口:使用右指针逐步扩展窗口,直到窗口包含了 t 中所有字符。
  3. 缩小窗口:一旦窗口满足条件,使用左指针尝试缩小窗口以找到更小的符合条件的子串。
  4. 更新最优解:在每次找到符合条件的窗口时,更新当前最小的覆盖子串的长度及其位置。
  5. 返回结果:如果找到满足条件的子串,返回最小的那个;如果没有找到,返回空字符串。

代码

class Solution {// 用于存储字符串 t 中每个字符及其出现的次数Map<Character, Integer> ori = new HashMap<Character, Integer>();// 用于存储当前窗口中对应字符的出现次数Map<Character, Integer> cnt = new HashMap<Character, Integer>();public String minWindow(String s, String t) {int tLen = t.length();// 初始化 ori 字典,存储 t 中每个字符出现的次数for (int i = 0; i < tLen; i++) {char c = t.charAt(i);ori.put(c, ori.getOrDefault(c, 0) + 1);}// 定义双指针 l 和 r, l 是左边界,r 是右边界int l = 0, r = -1;// 初始化最小长度 len 为一个较大的值,并定义答案的左右边界int len = Integer.MAX_VALUE, ansL = -1, ansR = -1;int sLen = s.length();// 移动右指针 r 来扩展窗口while (r < sLen) {++r;// 如果当前字符在 t 中出现过,则将其加入当前窗口 cnt 字典if (r < sLen && ori.containsKey(s.charAt(r))) {cnt.put(s.charAt(r), cnt.getOrDefault(s.charAt(r), 0) + 1);}// 当窗口满足条件时(即包含了 t 中所有字符)while (check() && l <= r) {// 更新最小覆盖子串的长度和对应的起始位置if (r - l + 1 < len) {len = r - l + 1;ansL = l;ansR = l + len;}// 尝试缩小窗口,即移动左指针 lif (ori.containsKey(s.charAt(l))) {cnt.put(s.charAt(l), cnt.getOrDefault(s.charAt(l), 0) - 1);}++l;}}// 如果找到了满足条件的最小子串,返回它;否则返回空字符串return ansL == -1 ? "" : s.substring(ansL, ansR);}public boolean check() {// 遍历 ori 字典的每一个键for (Character key : ori.keySet()) {// 获取 ori 中当前键对应的值,即 t 中该字符的数量Integer val = ori.get(key);// 如果 cnt 中该字符的数量小于所需数量,返回 falseif (cnt.getOrDefault(key, 0) < val) {return false;}}// 如果所有字符都满足条件,返回 truereturn true;}
}

getOrDefault(c, 0) 方法

getOrDefault 是 Java Map 接口中的一个方法,用来从映射(字典)中获取指定键的值。如果该键存在于映射中,则返回对应的值;如果该键不存在,则返回一个默认值。

方法签名

V getOrDefault(Object key, V defaultValue) 

参数

  key:要获取值的键。

  defaultValue:当键不存在时返回的默认值。

返回值

        如果 key 存在,则返回与 key 关联的值。

        如果 key 不存在,则返回 defaultValue

示例

假设有一个 Map

Map<Character, Integer> map = new HashMap<>();
map.put('A', 1);
  1. map.getOrDefault('A', 0):返回 1,因为键 'A' 在 map 中存在,且对应的值为 1
  2. map.getOrDefault('B', 0):返回 0,因为键 'B' 不存在,返回默认值 0

getOrDefault 与 get 的主要区别

  1. 默认值处理

    • getOrDefault 在键不存在时会返回一个用户指定的默认值。
    • get 在键不存在时会返回 null
  2. 代码简洁性

    • 使用 getOrDefault 可以避免显式的空值检查,从而使代码更简洁。例如,如果用 get,你可能需要手动处理 null 值:
Integer value = map.get('B');
if (value == null) {value = 0;  // 或者其他默认值
}

 使用 getOrDefault 可以直接得到一个合理的默认值:

Integer value = map.getOrDefault('B', 0);

      3. 防止空指针异常

  • 使用 getOrDefault 可以有效避免空指针异常,因为它确保在键不存在时返回的值不是 null,而是用户指定的默认值。
  • 使用 get 时,如果不进行 null 检查,可能会因为直接操作 null 导致空指针异常。

总结

  • getOrDefault(c, 0):在 Map 中获取键 c 的值,如果不存在该键,则返回默认值 0。它的优势是可以简化代码,避免 null 检查,并且安全地处理不存在的键。
  • get(c):在 Map 中获取键 c 的值,如果不存在该键,则返回 null。使用时需要注意处理 null,以避免空指针异常。

Integer 

Integer 本质上是一个对象,可以为其赋值 null,也可以用来存储从 -2^312^31 - 1 范围内的任何整数值。这使得 Integer 能够在各种场合使用,特别是在需要对象的地方。

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

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

相关文章

十四、低空安全综合管理服务平台建设方案

1、系统背景 由于低空安全研究关系到国家战略安全保障,世界各国相继开展了相关法律法规建设,以及一系列的理论与技术保障研究。为了保障低空空域安全,需推动建立各省级安全管理平台,做好与企业级监控服务平台的管理衔接和数据共享,强化本区域内民用无人机的安全监管工作;…

Node.js中的SQLite库:安装、对比与选择指南

嘿&#xff0c;各位Node.js的江湖好汉们&#xff0c;今天咱们来聊聊如何在Node.js中安装SQLite库&#xff0c;并且来一场SQLite库的PK大战&#xff0c;看看哪个库才是你的“菜”&#xff01; 一、安装SQLite库&#xff1a;轻松加愉快 想要在Node.js中使用SQLite数据库&#x…

解决el-table中使用el-input无法聚焦问题

在el-table中点击单元格时使用el-input或其他表单组件编辑单条数据。会出现聚焦不上的问题&#xff0c;需要手动点击才能够聚焦。究其原因是因为点击单元格时页面已自动聚焦到单元格&#xff0c;此时无法自动聚焦到对应的表单&#xff0c;需要手动设置。 <template><e…

进来一起把【数据结构】的【栈与队列】狠狠玩弄,痛快到大汗淋漓

1前言&#xff1a;顾名思义&#xff0c;栈与队列是两个东西&#xff0c;栈和队列&#xff01;对的&#xff0c;栈和队列&#xff01;&#xff01;&#xff0c;没错&#xff0c;在念一遍&#xff0c;【栈】 和 【队列】&#xff01;&#xff01;&#xff01;但是本质都是差…

数字化转型工具有哪些 无锡振宁科技

数字化转型已经成为现代企业不可忽视的趋势。为了帮助企业在这个过程中取得成功&#xff0c;选择合适的工具至关重要。今天&#xff0c;无锡振宁科技想和大家聊聊一些在数字化转型中不可或缺的工具&#xff0c;以及它们具体能带来哪些优势和变化。 1. 云计算平台 云计算是数字…

Yapi部署文档

Yapi是高效、易用、功能强大的API管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 官网地址&#xff1a;Yapi 环境&#xff1a; l Git l NodeJs&#xff08;7.6&#xff09; l Mongodb&#xff08;2.6&#xff09; 1、 NodeJs的安装 获取资源 …

第十八章程序清单合集——Java语言程序设计基础篇

目录 程序清单18_1ComputeFactorial.java 程序清单18_2ComputeFibonacci.java 程序清单18_1ComputeFactorial.java package chapter_18;import java.util.Scanner;public class 程序清单18_1ComputeFactorial {public static void main(String[] args) {Scanner input new S…

webpack打包报错UglifyJs Unexpected token: punc (,)

项目当dev命令运行时能正常运行&#xff0c;打包后却报错UglifyJs Unexpected token: punc (,)&#xff0c; > yarn buildCreating an optimized production build... Failed to compile.Failed to minify the bundle. Error: static/js/main.js from UglifyJs Unexpected …

VBA学习(71):Excel VBA 访问带密码保护的Access数据库/用户窗体设置/EXCEL用户+密码登录界面(Access版)

前两天我们分享了一个用户密码登录EXCEL的案例【Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户密码登录界面】&#xff0c;文中提及数据存储在Access中的情况&#xff0c;今天我就来把数据表&#xff08;tb用户&#xff09;移到Access中&#xff0c;修改一下代码&#xff…

cortex-m4系列绝对地址函数跳转问题

一、环境&#xff1a; cortex-m4&#xff0c;IAR&#xff0c;J-LINK。 二、问题&#xff1a; 1&#xff09;、首先&#xff0c; 我将另一个程序中的函数扣出来&#xff0c;通过j-flash-lite下载到MCU的一个固定地址Flash中。 2&#xff09;、然后&#xff0c; 声明一个变量为…

力扣刷题--821. 字符的最短距离【简单】

题目描述&#x1f357; 给你一个字符串 s 和一个字符 c &#xff0c;且 c 是 s 中出现过的字符。 返回一个整数数组 answer &#xff0c;其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 两个下标 i 和 j 之间的 距离 为 abs(i…

Elastic Stack--ELFK实例与Dashboard界面

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 学习B站博主教程笔记&#xff1a; 最新版适合自学的ElasticStack全套视频&#xff08;Elk零基础入门到精通教程&#xff09;Linux运维必备—Elastic…

低代码技术:简化应用开发,推动数字化转型

在当今快速变化的技术环境中&#xff0c;企业面临着巨大的压力&#xff0c;需要快速响应市场需求并持续推动数字化转型。传统的应用开发方式往往复杂且耗时&#xff0c;开发周期长且需要大量的编程工作。为了应对这些挑战&#xff0c;低代码技术应运而生&#xff0c;为企业提供…

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是&#xff1a;文件名字不正确&#xff0c;文件权限不对&#xff0c;文件不存在&#x…

基于激光雷达的无人机相互避障

本框架是基于激光雷达的无人机群自主避障代码&#xff1a; 其主体框架利用ORCA算法&#xff0c;他是经典的多智能体相互避障算法&#xff0c;此版本只能规避动态障碍物&#xff0c;不能规避环境形成的静态障碍物我们对ORVA算法稍作修改&#xff0c;使其可以分布式部署&#xff…

嵌入式系统------ARM

目录 一.c语言回顾 1.特殊符号 &#xff08;1&#xff09;const &#xff08;2&#xff09;static &#xff08;3&#xff09;extern 2.内存的结构 &#xff08;1&#xff09;kernel&#xff1a;内核 &#xff08;2&#xff09;栈区 &#xff08;3&#xff09;堆区 &#xff08…

Mental-LLM——通过在线文本数据利用大型语言模型进行心理健康预测

概述 源码地址&#xff1a;https://github.com/neuhai/Mental-LLM.git 论文地址&#xff1a;https://arxiv.org/abs/2307.14385 在一项关于哪些法律硕士适合精神健康护理的研究中&#xff0c;对以下五种法律硕士进行了比较 羊驼-7b。羊驼-LoRA。FLAN-T5-XXLGPT-3.5GPT-4. 作…

人该怎样活着呢?48

人该怎样活着呢&#xff1f; A多观察多思考 【思考问答】 &#xff08;20240411&#xff09; B记录自己的灵感。 &#xff08;20240412&#xff09; 别人抢不走的东西&#xff1a;肚子里的食物&#xff0c;脑子里的知识&#xff0c;还有梦想&#xff08;202011…

爬虫常用模板

这里记录的是我学习爬虫自己用到的一些东西&#xff0c;方便以后打开直接使用。我会不定期的往里面添加内容。 爬虫工具库-spidertools.cn 协程 模板1&#xff08;通过loop&#xff09;&#xff1a; async def download()passasync def main():# 创建任务队列tasks []for.…

Qt QPushButton 按钮添加数字气泡

使用场景 项目中&#xff0c;在某个按钮的右上角添加数字气泡是一个很常见的功能&#xff0c;可以用新建一个组合类来实现。不过这样比较麻烦&#xff0c;如果加气泡是后面的需求&#xff0c;可能改动的地方较多。 下面介绍2种比较简单&#xff0c;不需要改动按钮响应的方式。…