Leetcode面试经典150题-76.最小覆盖子串

news2024/11/16 4:17:57

解法都在代码里,不懂就留言或者私信

理论上提交这个就是最优解

class Solution {
    public String minWindow(String s, String t) {
        if(s.length() < t.length()) {
            return "";
        }
        /**转成字符数组 */
        char[] sArr = s.toCharArray();
        char[] tArr = t.toCharArray();
        /**其他情况我们构建一个一个欠账表,这里可以用hashMap,也可以使用数组
        hashMap可能更直观一些,我们还有一个遍历count用来记录我们一共欠了多少*/
        Map<Character, Integer> countMap = new HashMap<>();
        int count = tArr.length;
        for(int i = 0; i < tArr.length ; i++) {
            countMap.put(tArr[i], countMap.getOrDefault(tArr[i], 0) + 1);
        }
        /**本题我们使用滑动窗口解题,left是左边界(包含),right是右边界(不包含)
        窗口就是[left, right),开始值都是0,代表还没有任何数据*/
        int left = 0, right = 0;
        /**遍历字符串s,进行还款 */
        int minWidth = Integer.MAX_VALUE;
        /**记录得到最小值时的开始和结束的下标 */
        int minStartIndex = 0;
        int minEndIndex = 0;
        while(right < sArr.length) {
            /**只要还是还完的状态就不断的缩小窗口,直到欠债,我们现在就尝试让窗口缩小(left右移),但是我们缩小之前需要记录一下当前的窗口大小 */
            while(count == 0) {
                minWidth = Math.min(minWidth, right - left);
                /**如果当前窗口长度就是整个的最小长度,那更新得到最小值时的开始和结束的下标为当前窗口的开始和结束 */
                if(minWidth == right - left) {
                    minStartIndex = left;
                    minEndIndex = right;
                }
                /**如果left位置这个字符是tArr里右的并且我们当前没有多还,那left退出之后我们实际欠的就多了一个
                如果这个字符不是tArr里真实存在的那就不管*/
                if(countMap.containsKey(sArr[left])) {
                    /**有效字符并且之前没有多还,count就增多了1个 */
                    if(countMap.get(sArr[left]) >= 0) {
                        count ++;
                    }
                    countMap.put(sArr[left], countMap.get(sArr[left]) + 1);
                }
                left ++;
            }
            /**走到这肯定是欠债状态,那就尝试right右扩增大窗口试试能不能还上*/
            if(countMap.containsKey(sArr[right])) {
                /**如果原来确实欠了这个位置的字符才会影响count */
                if(countMap.get(sArr[right]) > 0) {
                    count --;
                }
                countMap.put(sArr[right], countMap.get(sArr[right]) - 1);
            }
            right ++;
        }
        /**走出循环如果还是不欠债,试试能不能让窗口在不再次负债的情况下缩小*/
        while(count == 0) {
            minWidth = Math.min(minWidth, right - left);
            if(minWidth == right - left) {
                minStartIndex = left;
                minEndIndex = right;
            }
            /**如果left位置这个字符是tArr里右的并且我们当前没有多还,那left退出之后我们实际欠的就多了一个
            如果这个字符不是tArr里真实存在的那就不管*/
            if(countMap.containsKey(sArr[left])) {
                /**有效字符并且之前没有多还,count就增多了1个 */
                if(countMap.get(sArr[left]) >= 0) {
                    count ++;
                }
                countMap.put(sArr[left], countMap.get(sArr[left]) + 1);
            }
            left ++;
        }
        /**如果最后有答案的话返回得到最小值时的窗口*/
        return minWidth == Integer.MAX_VALUE? "" : s.substring(minStartIndex, minEndIndex);
    }
}

 

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

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

相关文章

Docker编译环境的使用(ubuntu)

目录 Ubuntu安装docker 重启docker 拉取镜像 进入docker安装软件 提交docker 添加用户到docker组 进入docker 添加build用户 停止容器 保存docker镜像 load镜像 删除容器 Ubuntu安装docker sudo apt install docker.io 国内可用的源 Welcome to nginx! (tence…

git使用基础教程

(一)Git下载 git官网 - downloads 创建本地数据仓 1.创建文件夹 2.当前目录 cmd ---git init gitee.com注册登录 git创建项目 ide 项目地址本地数据库 ide项目上传云端 (一)git 1.git下载 2.新建仓库 3. 配置Configure---Version Control---Git----path to Git Get from…

某里227逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解…

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【LeetCode】最接近的三数之和

题目要求 解题思路 这道题解题方法和三数之和解题思路一样&#xff0c;可以参考上一篇博客 代码实现 class Solution { public:int threeSumClosest(vector<int>& nums, int target) {//排序sort(nums.begin(),nums.end());int lennums.size();//固定一个&#x…

流媒体协议RTSP(其二)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客一、RTSP简介二、请求消息结构三、应答消息结构四、RTSP交互流程 前期博客 流媒体与直播的基础理论&#xff08…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——卷积神经网络的前世今生

一、卷积神经网络简介 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;尤其擅长处理图像和视频等高维度的数据。CNN 通过模仿人类视觉系统的工作方式&#xff0c;自动学习数据中的空间层次结构&#xff0c;使得它在计算…

启动第一个docker容器

1 、 docker pull ubuntu:20.04 下载镜像 2、 docker image ls 查看镜像 3、 docker run --nametest -itd 9df6d6105df2 创建并运行一个容器 4、 查看容器 docker ps -a 5、 登录容器 docker exec -it test /bin/bash 6 退出容器 exit 7 删除容器 docker rm 238514292c…

JVM面试真题总结(二)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ volatile关键字能防止指令重排序吗?如何实现? volatile关键字可…

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)

2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.…

基于人工智能的图像风格迁移系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像风格迁移是一种计算机视觉技术&#xff0c;它可以将一种图像的风格&#xff08;如梵高的绘画风格&#xff09;迁移到另一幅图像上…

在VMware虚拟机中编译文件的时候报错:找不到头文件ft2build.h

以下是报错内容&#xff0c;提示说找不到头文件ft2build.h freetype_show_font.c:12:10: fatal error: ft2build.h: No such file or directory #include <ft2build.h> ^~~~~~~~~~~~ compilation terminated. 在编译之前已经交叉编译了freetype&#xff0c;…

如何使用 Python 读取 Excel 文件:从零开始的超详细教程

“日出东海落西山 愁也一天 喜也一天 遇事不钻牛角尖” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day03为什么要用 Python 读取 Excel 文件&#xff1f;准备工作&#xff1a;安装所需工具安装 Python安装 Pandas安装 openpyxl 使用 Pandas 读取 Excel 文件什么是 …

归并排序-非递归实现

归并排序的非递归实现 我们可以把 一个数组 先拆分成 最小单元&#xff0c;这是分&#xff0c; 拆分成最小单元之后&#xff0c;我们对每个最小单元进行一次合并&#xff0c;这是治 最小单元 合并一次之后&#xff0c;我们继续 在上一次合并的基础上拆分&#xff0c;并且合…

心觉:你为什么没有更多的钱

很多人希望自己可以赚更多的钱 但是他的内心又很讨厌钱&#xff0c;他自己并不知道 一边希望自己赚更多钱&#xff0c;一边在骨子里觉得“金钱是万恶之源” 这是一种神经质的错乱 这种现象在什么情况下会表现得比较明显呢&#xff1f; 某位高官因为贪污受贿落马了&#xf…

Cesium坐标系

针对作坐标系这边参考网上以及自己的一些理解大家可以参考学习一下。 文章目录 **一、GIS 坐标系****二、经纬度坐标&#xff08;球面坐标&#xff09;****三、地理坐标&#xff08;弧度&#xff09;****四、屏幕坐标系****五、空间直角坐标系****六、Cesium 中的坐标系****七、…

【C++模版初阶】——我与C++的不解之缘(七)

一、泛型编程 在之前&#xff0c;我们想要实现一个交换两个值的函数&#xff0c;我们要实现好多个&#xff08;int类型、double类型、char类型以及自定义类型&#xff09;对于每一个类型&#xff0c;我们都需要实现一个交换函数&#xff1a; int Swap(int& x, int& y)…

【Qt】仿照qq界面的设计

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>//QT中信息调试类&#xff0c;用于输出数据&#xff0c;无需使用该类的实例化对象&#xff0c;直接使用成员函数即可 #include <QIcon>//图标类 #include <QPushButton&…

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution { public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k){if(leftright)return nums…

Linux 如何将pwd的结果同步复制到剪贴板

pwd是我们经常使用的一个命令&#xff0c;它的作用是显示当前所在路径。 不过&#xff0c;很多时候我们使用pwd命令不仅仅是查看当前路径&#xff0c;而是复制路径。 通常情况下&#xff0c;使用pwd命令进行复制路径的操作如下&#xff1a; 使用pwd显示路径&#xff08;键盘…