最小覆盖子串-java

最小覆盖子串-java

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

    注意:

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**解题思想: **
  • 滑动窗口算法是一种用于解决子字符串问题的经典方法。**其核心思想是通过维护一个窗口,根据特定条件移动窗口的左右边界来寻找满足要求的子串。**对于这个问题,我们要在字符串 s 中找到一个最小的子串,使得该子串包含字符串 t 中的所有字符。
  • 该算法的时间复杂度为O(m+n),其中m是字符串s的长度,n是字符串t的长度。这是因为在移动左右边界的过程中,每个字符最多被访问两次,而不会存在重复遍历的情况。
解题思路如下 :
  • 初始化两个频率数组**winFreqtFreq**,用于记录窗口内字符的频率和字符串t中字符的频率。
  • 遍历字符串t,更新**tFreq**数组,记录字符串t中每个字符出现的次数。
  • 初始化窗口的左右边界**leftright,以及记录窗口起始位置begin和最小长度minLen。初始时,将leftright都置为0**,begin置为0minLen置为s.length()+1
  • 开始移动右边界**right,扩大窗口,直到窗口包含了字符串t中的所有字符。每次移动右边界时,更新winFreq数组,并检查是否满足包含字符串t中所有字符的条件。如果满足条件,则开始移动左边界left**,缩小窗口,直到窗口不再满足条件为止。
  • 在移动左右边界的过程中,不断更新最小长度**minLen和起始位置begin**。
  • 最终返回起始位置**begin和最小长度minLen**所对应的子串。
代码实现如下:
class Solution {
public String minWindow(String s, String t){if(s.isEmpty() || t.isEmpty() || s.length() < t.length())return "";int[] winFreq = new int[128];int[] tFreq = new int[128];for(char c : t.toCharArray())tFreq[c]++;int minLen = s.length() + 1;int begin = 0;int left = 0;int right = 0;int distance = 0;while(right < s.length()){if(tFreq[s.charAt(right)] == 0){right++;continue;}if(winFreq[s.charAt(right)] < tFreq[s.charAt(right)])distance++;winFreq[s.charAt(right)]++;right++;while(distance == t.length()){if(tFreq[s.charAt(left)] == 0){left++;continue;}if(right - left < minLen){minLen = right - left;begin = left;}if(winFreq[s.charAt(left)] == tFreq[s.charAt(left)])distance--;winFreq[s.charAt(left)]--;left++;}}if(minLen == s.length() + 1)return "";return s.substring(begin, begin + minLen);}
}

image-20240331011703253

(begin, begin + minLen);
}
}


[外链图片转存中...(img-UrZ1A3OY-1711819077144)]

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

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

相关文章

Mac上Matlab_R2023b ARM 版 启动闪退(意外退出)解决方法

安装好后&#xff0c;使用 "libmwlmgrimpl.dylib" 文件替换掉"/Applications/Matlab_R2023b.app/bin/maca64/matlab_startup_plugins/lmgrimpl"文件夹下的同名文件 在终端下执行如下命令&#xff1a; codesign --verbose --force --deep -s - /Applicat…

本地项目上传到GitHub

本文档因使用实际项目提交做为案例&#xff0c;故使用xxx等字符进行脱敏&#xff0c;同时隐藏了部分输出&#xff0c;已实际项目和命令行输出为准 0、 Git 安装与GitHub注册 1&#xff09; 在下述地址下载Git&#xff0c;安装一路默认下一步即可。安装完成后&#xff0c;随便…

乡村数字化转型:科技赋能打造智慧农村新生态

随着信息技术的迅猛发展&#xff0c;数字化转型已成为推动社会进步的重要引擎。在乡村振兴的大背景下&#xff0c;乡村数字化转型不仅是提升乡村治理能力和治理水平现代化的关键&#xff0c;更是推动农业现代化、农村繁荣和农民增收的重要途径。本文旨在探讨乡村数字化转型的内…

解决MySQL幻读?可重复读隔离级别背后的工作原理

什么是当前读和快照读 当前读&#xff1a;又称为 "锁定读"&#xff0c;它会读取记录的最新版本&#xff08;也就是最新的提交结果&#xff09;&#xff0c;并对读取到的数据加锁&#xff0c;其它事务不能修改这些数据&#xff0c;直到当前事务提交或回滚。"sele…

MATLAB 打开文件对话框选择点云输入 (52)

MATLAB 打开文件对话框选择点云输入 (52) 一、算法介绍二、算法实现1.代码一、算法介绍 从指定的路径中(具体的文件夹),选择指定的文件格式(比如ply文件),读取手动点击选择的点云。 整个过程通过打开资源管理器的对话框来手动点击选择点云读取。直接运行即可。 二、算…

Linux课程____shell脚本应用

:一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …

CSS3 简介

1.CSS3 概述 CSS3 是CSS2 的升级版本&#xff0c;它在CSS2 的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际 面临的问题。 CSS3 在未来会按照模块化的方式去发展&#xff1a; https://www.w3.org/Style/CSS/current-work.html CSS3 的新特性如下&am…

翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’&#xff1f; Raymond Chen 2003年8月8日 分享一个没用的知识&#xff1a; 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

sectigo 单IP证书360元

IP数字证书使用了强大的加密功能&#xff0c;能够有效保护网站和用户数据在传输过程中的安全。由Sectigo颁发的各种数字证书兼容性高&#xff0c;可以支持几乎所有主流浏览器&#xff0c;在用户访问时不会出现“不安全”提示&#xff0c;Sectigo旗下的IP证书可以为只有公网IP地…

HAProxy + Vitess负载均衡

一、环境搭建 Vitess环境搭建&#xff1a; 具体vitess安装不再赘述&#xff0c;主要是需要启动3个vtgate&#xff08;官方推荐vtgate和vtablet数量一致&#xff09; 操作&#xff1a; 在vitess/examples/common/scripts目录中&#xff0c;修改vtgate-up.sh文件&#xff0c;…

阳光消费金融2023利润创新高,固收业务立功

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 3月28日&#xff0c;光大银行披露了2023年年报&#xff0c;亦公布旗下消金公司阳光消费金融业绩。截至2023年末&#xff0c;阳光消费金融总资产116.77 亿元&#xff0c;同比下滑6.41%&#xff1b;净资产13.19亿元&#…

Python之Opencv教程(4):识别图片中多张人脸

1、识别代码 导入必要的库 import cv2加载人脸识别器 face_detector cv.CascadeClassifier("data//haarcascade_frontalface_alt.xml")这里使用了OpenCV自带的人脸识别分类器&#xff0c;路径为cv2.data.haarcascades ‘haarcascade_frontalface_default.xml’。你…

sqlmap基础知识(二)

一、sqlmap的基本使用 读取文件/上传文件 支持的数据库类型 仅对MySQL、MSSQL、PostgreSQL有效&#xff0c;可以进行文件操作 前提条件 必须是高权限用户 mysql禁用secure_file_priv php禁用GPC 有目录读写文件权限 sqlmap -u url --is-dba # 查看是否为dba权限&#xff0c;…

pytorch | torch.contiguous()方法

torch.contiguous()方法语义上是“连续的”&#xff0c;经常与torch.permute()、torch.transpose()、torch.view()方法一起使用&#xff0c;要理解这样使用的缘由&#xff0c;得从pytorch多维数组的低层存储开始说起&#xff1a; touch.view()方法对张量改变“形状”其实并没有…

Android WindowManager工具类

WindowManager提供三个方法&#xff1a; addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。 <!--悬浮窗权限--><uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/> WindowManagerUtil pack…

Linux-3 yum和vim

目录 本节目标&#xff1a; Linux 软件包管理器 yum 什么是软件包 1.yum是什么&#xff1f;软件包&#xff1f; 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件&#xff1f; 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

【Go】goroutine并发常见的变量覆盖案例

越过山丘 遇见六十岁的我 拄着一根白手杖 在听鸟儿歌唱 我问他幸福与否 他笑着摆了摆手 在他身边围绕着一群 当年流放归来的朋友 他说你不必挽留 爱是一个人的等候 等到房顶开出了花 这里就是天下 总有人幸福白头 总有人哭着分手 无论相遇还是不相遇 都是献给岁月的序曲 …

Github 2024-03-30 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目2C项目1Jupyter Notebook项目1Go项目1非开发语言项目1Mojo项目1开源 iOS 应用合作列表 创建周期:3351 天协议类型:…

ubuntu18.04安装qt

ubuntu18.04安装qt 1、下载文件 比如我下载的是5.13.0版本 下载链接 2、安装 wget https://download.qt.io/archive/qt/5.13/5.13.0/qt-opensource-linux-x64-5.13.0.runsudo chmod x qt-opensource-linux-x64-5.13.0.runsudo ./qt-opensource-linux-x64-5.13.0.run参考文…

数学分析复习:等价量的概念

本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 等价量 定义&#xff1a;无穷小量、无穷大量 若 lim ⁡ x → x 0 f ( x ) 0 \lim\limits_{x\to x_0}f(x)0 x→x0​lim​f(x)0&#xff0c;则称当 x → x 0 x\to x_0 x→x0​ 时&#xff0c; f ( x ) f(x) f(x) 是无…