包含所有字符的最短字符串

        由题还是很容易想到可以用一个哈希表来统计字符串中每个字符出现的次数。首先扫描字符串t,每扫到一个,哈希表中对应值加1。然后扫描字符串s,每扫描一个就检查哈希表中是否包含该字符,没有则忽略不计。如果存在,对应的值减1。所有如果字符串s包含字符串t的所有字符,那么哈希表中的所有的值应该都小于或等于0。

        还是维护一个滑动窗口,某一时刻两指针间子字符串还没包含字符串t的所有字符,则移动右指针添加新的字符,如果还没有则继续移动右指针。

        某一时刻两指针间子字符串已经包含字符串t的所有字符,因为目标是找出最短符合条件的子字符串,所有移动左指针,然后判断删除最左边的字符后是否仍包含字符串t的所有字符。

    public String minWindow(String s, String t) {// 创建一个HashMap,用于存储字符串 t 中每个字符的出现次数// 因为用HashMap很方便判断一个字符是否在字符串t中出现// 所有没有用数组去模拟哈希表HashMap<Character, Integer> charToCount = new HashMap<>();// 遍历字符串 t,将每个字符及其出现次数存入HashMapfor (char ch : t.toCharArray()) {charToCount.put(ch, charToCount.getOrDefault(ch, 0) + 1);}// 初始化计数器,表示还需要找到的字符个数int count = charToCount.size();// 初始化左、右指针和最小窗口的起始和结束位置int start = 0, end = 0, minStart = 0, minEnd = 0;// 初始化最小窗口的长度为整数最大值int minLength = Integer.MAX_VALUE;// 开始遍历字符串 swhile (end < s.length() || (count == 0 && end == s.length())) {if (count > 0) {// 如果还有字符未找到// 取得当前指针处的字符char endCh = s.charAt(end);// 如果该字符在字符串 t 中存在if (charToCount.containsKey(endCh)) {// 更新HashMap中该字符的出现次数charToCount.put(endCh, charToCount.get(endCh) - 1);// 如果出现次数减至零,表示该字符已找到足够次数if (charToCount.get(endCh) == 0) {count--;}}// 移动指针end++;} else {// 如果所有字符都已找到// 计算当前窗口的长度if (end - start < minLength) {minLength = end - start;minStart = start;minEnd = end;}// 取得当前指针处的字符char startCh = s.charAt(start);// 如果该字符在字符串 t 中存在if (charToCount.containsKey(startCh)) {// 更新HashMap中该字符的出现次数charToCount.put(startCh, charToCount.get(startCh) + 1);// 如果出现次数增至1,表示还需要找到该字符if (charToCount.get(startCh) == 1) {count++;}}// 移动指针start++;}}// 返回最小窗口子串,如果没有找到则返回空字符串return minLength < Integer.MAX_VALUE ? s.substring(minStart, minEnd) : "";}

        下面是对代码的一个详细解释(因为是Hard难度所以再借助AI全面阐述一遍)

  1. 初始化HashMap: 代码一开始创建了一个HashMap charToCount,用于存储字符串 t 中每个字符的出现次数。

  2. 遍历字符串 t 程序首先遍历字符串 t,将其中每个字符及其出现的次数存储在 charToCount 中。

  3. 初始化变量: 初始化了一些变量,包括计数器 count(表示还需要找到的字符个数)、指针 startend(用于构建窗口)、以及用于记录最小窗口的起始和结束位置的变量 minStartminEnd,同时也初始化了记录最小窗口长度的变量 minLength 为整数最大值。

  4. 使用滑动窗口算法: 在这段代码中,通过滑动窗口算法来寻找符合条件的最小窗口子串。

  5. 遍历字符串 s 使用 while 循环遍历字符串 s,其中 end 指针不断向右移动。

  6. 找到包含 t 中所有字符的窗口:

    • count > 0 时,表示还有字符未找到。程序会检查当前 end 指向的字符是否在字符串 t 中,如果是,更新该字符在 charToCount 中的计数,当某个字符的计数减为零时,count 减一,表示找到了一个字符。
    • 一旦 count 减至零(意味着已经找到了所有 t 中的字符),代码会执行 else 部分,这时会计算当前窗口的长度,并与之前记录的最小长度进行比较。
    • 如果当前窗口的长度更小,则更新最小长度 minLength,同时记录当前窗口的起始和结束位置 minStartminEnd
    • start 指针向右移动,并且对应字符在 charToCount 中的计数也会相应地更新,直到 count 不再为零。
  7. 返回结果: 最后,根据 minLength 是否被更新过来判断是否找到了包含 t 中所有字符的最小窗口子串。如果找到了,返回该子串;否则返回空字符串。

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

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

相关文章

【数据结构】八大排序之快速排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.快速排序简介及思路 二.快速排序代码实现的三种方式 &#x1f4cc;左右交换法 &#x1f4cc;挖坑填坑法 &#x1f4cc;前后指针法 三.快速排序的时间复杂度分析…

ssm基于HTML5的交流论坛的设计与实现+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【Java EE初阶九】多线程进阶一(锁策略)

前言 锁的策略&#xff1a;加锁过程中&#xff0c;即处理冲突的过程中&#xff0c;需要涉及到的一些不同的处理方式&#xff08;此处锁策略并不是java独有的&#xff09;&#xff0c;本篇内容主要是讲解一下关于锁的相关知识点&#xff1b; 1. 关于锁的分组 1.1 第一组&#x…

动态内存管理:malloc free

//——————1.动态内存管理&#xff08;内存空间&#xff09; 共四个函数&#xff1a;malloc free calloc realloc 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] { 0 };//在栈空间上开…

一、Qt介绍

一、Qt介绍 1、介绍 Qt是一套程序开发库&#xff0c;但是与MFC&#xff08;依赖于Windows API&#xff09;不同&#xff0c;Qt是跨平台开发库。 Qt获取&#xff1a;[Qt下载地址](https://download.qt.io/archive/qt/)2、Qt安装 QtMinGWSourcesQt ChartsQt Data Visualizatio…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换&#xff08;图片部分圆角矩形&#xff09; 在Android开发中&#xff0c;使用Glide加载图片时&#xff0c;我们经常需要对图片进行特定的处理&#xff0c;比如裁剪和圆角变换&#xff0c;特别是一些设计稿&#xff0c;…

cpufreq子系统

cpufreq是linux上负责实现动态调频的关键&#xff0c;这篇笔记总结了linux内核cpufreq子系统的关键实现&#xff08;Linux 3.18.140&#xff09;。 概述 借用一张网络上的图片来看cpufreq子系统的整体结构&#xff1a; 用户态接口&#xff1a;cpufreq通过sysfs向用户态暴露接…

Java知识点:泛型、类加载器、内部类、可变参数

文章目录 1、this关键字2、泛型2.1 泛型介绍2.2 泛型分类定义2.2.1 泛型类2.2.2 泛型方法2.2.3 泛型接口 2.3 泛型通配符 3、可变参数4、日志4.1 使用步骤4.2 日志级别4.3 配置文件 5、类加载器5.1 类加载器5.2 类加载的完整过程5.2.1 类加载时机5.2.2 类加载过程 5.3 类加载的…

【开源项目】超经典开源项目实景三维数字孪生智慧工厂

数字孪生工厂&#xff0c;以模型驱动的自动化&#xff0c;与数据驱动的人工智能技术紧密融合与协同&#xff0c;实现机器、工件与组件间全面的和点对点的数据通信。飞渡科技基于自研DTS平台&#xff0c;将物联网IOT、人工智能、大数据、云计算等技术应用于工厂&#xff0c;实现…

期货日数据维护与使用_日数据维护_模块运行演示

写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个空项目的&#xff0c;请参看以下两篇博文 PyQt5将项目搬到一个新的虚拟环境中 https://blog.csdn.net/m0_37967652/article/details/122625280 python_PyQt5开发工具结构基础 https://blog.cs…

TMC4671闭环调试步进、伺服、音圈、永磁、无刷电机

一、IDE 连接开发板 下 面 讲 解 IDE 和 开 发 板 连 接 的 详 细 操 作 。 这 里 我 们 选 择 用 主 控 板 TMC671-EVALTMC6200-EVAL 开发板做讲解。其它型号的开发板也是大同小异 的操作步骤。 1&#xff0e;首先我连接好开发板&#xff0c;并给开发板上电 连接好的开发板如下…

【激活函数】SELU 激活函数

1、介绍 SELU (Scaled Exponential Linear Unit) SELU是对ELU激活函数的改进&#xff0c;通过引入自动标准化机制&#xff0c;使得神经网络的隐藏层在训练过程中可以自动地保持输出的均值和方差接近于1。 # 定义 SELU 激活函数 def selu(x, alpha1.67326, lambda_1.0507):retu…

【Python百宝箱】数据清洗艺术:Python库助力打磨完美数据

数据清洗与预处理&#xff1a;Python库大揭秘 前言 在数据科学领域&#xff0c;数据清洗和预处理是构建可靠模型的关键步骤。本文深入探讨了一系列强大的Python库&#xff0c;它们在处理重复数据、字符串匹配、数据整理以及降维等方面发挥着重要作用。通过学习这些库&#xf…

单片机相关知识点

在STM32上运行FreeRTOS&#xff0c;十分简练的小文章FreeRTOS&#xff08;STM32CubeMX&#xff09;_cubemx freertos-CSDN博客 STM32CubeMX转Keil使用STM32CubeMX生成Keil工程并完成流水灯-CSDN博客

unity PDFRender Curved UI3.3

【PDF】PDFRender 链接&#xff1a;https://pan.baidu.com/s/1wSlmfiWTAHZKqEESxuMH6Q 提取码&#xff1a;csdn 【曲面ui】 Curved UI3.3 链接&#xff1a;https://pan.baidu.com/s/1uNZySJTW0-pPwi2FTE6fgA 提取码&#xff1a;csdn

【unity小技巧】FPS游戏实现相机的震动、后坐力和偏移

最终效果 文章目录 最终效果前言相机的震动实现后坐力和偏移相机震动相机震动脚本换弹节点震动 武器射击后退效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看…

Linux ssh 实现远程免密登录

一、背景 我搭建了一个 zookeeper 集群&#xff0c;写了一个 shell 脚本来控制集群的启动和关闭&#xff0c;但是我发现每次我执行 shell 脚本的时候&#xff0c;都需要我输入各个服务器的密码才可以运行&#xff0c;感觉很麻烦。shell 脚本里面连接其他服务器用的就是 ssh 的方…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…

equals()方法和“==”运算符

equals()equals()方法和“”运算符比较 回到顶部 equals() 超类Object中有这个equals()方法&#xff0c;该方法主要用于比较两个对象是否相等。该方法的源码如下&#xff1a; public boolean equals(Object obj) {return (this obj);} 我们知道所有的对象都拥有标识(内存…

使用LVM分区方式安装Manjaro发行版

使用LVM分区方式安装Manjaro发行版 为什么单独介绍LVM方式呢&#xff1f; 主要是由于使用系统的图形安装工具创建卷组会出问题&#xff0c;会导致图形安装工具直接挂掉&#xff0c;唯一的方法是提前手动创建好卷组。 GPT分区表 分区表有&#xff1a; MBR(主引导记录分区表)…