Leetcode 76 最小覆盖子串 java版

官网链接:

. - 力扣(LeetCode)

1. 问题

给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成

2. 滑动窗口(author: mcdnull):

     分为left, right 两个指针。先让right 往右侧移动。直至满足条件 包含了t子串 再移动left 右移。期间记录最短指针长度,两个指针位置

步骤一

不断增加right 指针使滑动窗口增大,直到窗口包含了T的所有元素

步骤二

不断增加left指针使滑动窗口缩小,因为是要求最小字串,所以将不必要的元素排除在外,使长度减小,直到碰到一个必须包含的元素,这个时候不能再扔了,再扔就不满足条件了,记录此时滑动窗口的长度,并保存最小值

步骤三

让left再增加一个位置,这个时候滑动窗口肯定不满足条件了,那么继续从步骤一开始执行,寻找新的满足条件的滑动窗口,如此反复,直到right超出了字符串S范围。

 3. 代码:

package com.yunjing.mall.controller.app;import java.util.HashMap;
import java.util.Map;/*** 描述:* 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。** @Author: lbc* @Date: 2024-03-25 8:16* @email: 594599620@qq.com* @Description: keep coding*/
public class Solution {/*** 滑动窗口* 右侧窗口先滑动,左侧再进行滑动 右移** @param s* @param t* @return*/public static String minWindow(String s, String t) {long start = System.currentTimeMillis();if (s == null || t == null || s.length() < t.length()) {return "";}// 左滑指针int left = 0;// 判断窗口是否包含了t的所有元素,避免每次去遍历map,增加耗时int needCnt = t.length();int[] minResult = new int[]{0, Integer.MAX_VALUE};Map<Character, Integer> map = new HashMap<>();// 初始化mapfor (int i = 0; i < t.length(); i++) {map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);}// 先走右边界for (int right = 0; right < s.length(); right++) {char c = s.charAt(right);if (map.getOrDefault(c, 0) > 0) {needCnt--;}map.put(c, map.getOrDefault(c, 0) - 1);if (needCnt == 0) {for (; ; ) {c = s.charAt(left);if (map.get(c) == 0) {break;}// 左边界map.put(c, map.getOrDefault(c, 0) + 1);left++;}// 更新结果, 覆盖resif (right - left < minResult[1] - minResult[0]) {minResult[1] = right;minResult[0] = left;}c = s.charAt(left);//将左边界右移,执行下一个窗口// 由于左边界是t需要的字符,右移后,需要更新tMap和needCnt,表示还需要增加一个字符map.put(c, map.getOrDefault(c, 0) + 1);needCnt++;left++;}}System.out.println("use: " + (System.currentTimeMillis() - start) + "ms");// 超过边界,返回空串return minResult[1] > s.length() ? "" : s.substring(minResult[0], minResult[1] + 1);}public static void main(String[] args) {System.out.println(minWindow("ABEFDGFGESFEWEFJKLEFJPFKPOEKGWPEGEFPDFJSDFJLKEJFKFJEIKJWOEIFGJWEIOGFEWOIFGJWEFOIJWEFWPOEJFFJ", "BFS"));System.out.println(minWindow("EFJEGFJEFJKDJFEOFGKJPEPEPFKMLFKFLEKFEFEFEFGEEFEFGGJKPOWKFPOKWEOPFKWPEOFD", "JJD"));}}

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

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

相关文章

document.getElementById(‘username‘).value 是什么

document.getElementById(username).value; 这段代码是 JavaScript 中用于获取 HTML 元素的值的常见方式。 document 是 JavaScript 中代表当前文档&#xff08;即 HTML 页面&#xff09;的对象。getElementById(username) 是 document 对象的方法&#xff0c;用于获取具有指定…

Windows运维_Windows下配置Apache-Haus(Apache2.4)

Windows运维_Windows下配置Apache-Haus(Apache2.4) Apache Haus 是一个由网站管理员, 开发人员和爱好者组成的社区, 他们更喜欢使用 Apache Web 服务器而不是 IIS。 无论是出于商业还是娱乐目的, Apache 在 Windows 上的使用正在稳步增加, 我们希望通过为人们提供一个可以获得…

VsCode安装,配置,快捷键及常用开发插件的安装与介绍

文章目录 一.安装包下载方式一.官网下载方式二.网盘下载 二.安装三.VSCode插件安装1.中文语言包2.拼写检察器3.HTML自动补全4.JavaScript-ES6语法提示5.补全前端代码6.路径提示7.Vue3/Vue2开发必用8.自动闭合HTML/XML标签9.标签同步修改10.格式化html,css,js11.区分括号12.快速…

Vue3更新Package.json版本号

由于我之前已经更新过了&#xff0c;下面的方法提示我已经是最新的了&#xff0c;记录一下&#xff0c;过段时间在测试一下 npm install -g vue/clivue upgrade

面试算法-113-打家劫舍

题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放…

DHCP中继配置示例

DHCP&#xff0c;属于应用层的协议&#xff08;使用UDP协议封装&#xff0c;客户端端口&#xff1a;68&#xff0c;服务器端端口&#xff1a;67&#xff0c;中继端的端口&#xff1a;67&#xff09; 两种配置方式&#xff1a;1、接口配置&#xff1b;2、全局配置。 ipconfig …

Redis-指定配置启动

基础篇Redis 3.3.5.指定配置启动 如果要让Redis以后台方式启动&#xff0c;则必须修改Redis配置文件&#xff0c;就在我们之前解压的redis安装包下&#xff08;/usr/local/src/redis-6.2.6&#xff09;&#xff0c;名字叫redis.conf&#xff1a; 我们先将这个配置文件备份一份…

微信小程序版本更新检测

app.vue文件 <script>export default {onLaunch: function() {console.log(App Launch)// #ifdef MP-WEIXINthis.getUpdateManager();// #endif},methods: {// 检测小程序更新getUpdateManager() {const updateManager wx.getUpdateManager();updateManager.onCheckFor…

JS基础之 数据浅拷贝与深拷贝

一、拷贝背景 JS引用数据类型有两类&#xff1a;基本数据类型和引用数据类型&#xff1b; 基本类型&#xff1a;String&#xff0c;Number&#xff0c;Boolean&#xff0c;Null&#xff0c;Undefined&#xff0c;symbol这6种基本数据类型它们是直接按值存放的&#xff0c;所以…

Day21代码随想录(1刷) 二叉树

530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1示例 2&#xff1…

微信小程序实现图片懒加载的4种方案

实现图片懒加载的意义 实现图片懒加载可以提高小程序的性能和用户体验&#xff0c;是微信小程序开发中非常重要的一项优化手段。微信小程序实现图片懒加载的目的主要有以下几点&#xff1a; 提高页面加载速度&#xff1a;图片通常是页面中最耗时的资源&#xff0c;如果一次性…

【Java项目】基于jspssm的高校二手交易平台

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网技术的不断进步&#xff0c;高校二手交易市场通过网络平台得到了显著的扩展。开发这一平台时&#xff0c;首要任务是深入挖掘并满足用户的实际需求&#xff0c;通过精准把握用户需求来构建一个专门化的高校二手交易系…

Linux下的I/O模型

目录 一、什么是IO&#xff1f; 二、IO操作的两个阶段 三、五种I/O模型 1、阻塞I/O(blocking I/O) 2、非阻塞I/O(non-blocking I/O) 3、多路复用I/O(multiplexing I/O) 4、信号驱动I/O(signal-driven I/O) 5、异步I/O(asynchronous I/O) 四、五种I/O模型比较 一、什么…

3.25作业

定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream>using namespace std;namespace…

Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理

附件下载 联系工作人员获取附件 这篇文章会说明如何在 MATLAB 或 Python 中以 Zemax OpticStudio 应用程式介面 (ZOS-API)处理光线数据库(Ray Database, ZRD)档案&#xff0c;过程中我们将使用ZRDLoader.dll。本文提供了在 Matlab 中批次处理序列光线追迹(一般、归一化、偏振…

定制化区块链交易所开发:Dapp、DeFi和IDO的全方位解决方案

随着区块链技术的不断发展&#xff0c;区块链交易所已经成为数字资产交易的主要场所之一。然而&#xff0c;由于不同项目的需求和特点各不相同&#xff0c;通用的交易所往往无法满足所有的需求。因此&#xff0c;定制化区块链交易所的需求逐渐增加&#xff0c;以满足不同项目的…

搜维尔科技:「工业仿真」煤炭矿井模拟仿真救援项目实施

煤炭矿井模拟救援系统满足煤矿企业在紧急避险应急演练方面的实际需要&#xff0c;在不耽误井下正常生产的情况下&#xff0c;高效率、低成本地实现对本矿区入井人员进行避灾演练培训&#xff0c;并学会正确的避灾自救互救方法。并可在本系统中直观的看到人员定位系统、监控系统…

【JAVA】建立一个图书管理系统

在建立一个图书管理系统的时候我们首先需要构造一个书类 public class Book {private String name;private String author;private int price;private String type;private boolean isBorrwed;public Book(String name, String author, int price, String type) {this.name n…

【原创】RockyLinux9.3手动编译MySQL8.2.0源码,超详细!!

前言 MySQL安装如果使用rpm包安装实在过于麻烦&#xff0c;缺这缺那的&#xff0c;我就想能不能就源码包自己手动编译安装&#xff0c;编译完的包可以给其他服务器直接用&#xff0c;这样只需要麻烦一次&#xff0c;后面就方便了。至于为什么不用RockyLinux8.6版本&#xff0c…

在JS中对字符串指定位置插入字符串

封装方法 insertchar(oldStr, index, newStr) {return oldStr.slice(0, index) newStr oldStr.slice(index)}使用 insertchar(202403, 4, -)输出2024-03 例如&#xff1a;后台给返回的出生日期为 19921224 但是再次传台需要用-拼接的日期格式 insertchar(‘19921224’, 4, ‘…