Leetcode 76 最小覆盖子串 java版

news2024/11/15 6:57:27

官网链接:

. - 力扣(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<>();
        // 初始化map
        for (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++;
                }

                // 更新结果, 覆盖res
                if (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.coloradmin.cn/o/1543603.html

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

相关文章

langchian入门四:LLM+Agents代理=贾维斯?让大模型拥有三头六臂

什么是Agent 在日常生活中,不难发现,chatgpt通过文本输入进行处理后返回的也是文本内容,就像是一个只有头的人,能听能思考能说话,但是无法行动.而Agent是一种能够自主决策、采取行动以达到某种目标的实体。被解释为"智能体"或者"代理". 代理的核心思想是…

Java全栈课程之Linux———基本属性

一、看懂文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 在Linux中我们可以使…

Mysql数据库——数据备份与恢复

目录 一、数据备份的重要性 二、数据库备份的分类 1.从物理与逻辑的角度分类 2.从数据库的备份策略角度&#xff0c;备份可分为 2.1完全备份 2.2差异备份 2.3增量备份 2.4总结 三、常见的备份方法 四、Mysql数据库完全备份 1.完全备份定义 2.优缺点 3.数据库完全备…

代码随想录算法训练营第25天|LeetCode106.中序和后序遍历构造二叉树、LeetCode105.中序和先序遍历构造二叉树

代码随想录算法训练营第25天|LeetCode106.中序和后序遍历构造二叉树、LeetCode105.中序和先序遍历构造二叉树 1、LeetCode106.中序和后序遍历构造二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 知道理论怎么求&#xff0c;但是太久没写…

Adaptive Partitioning

qnx开源代码 GitHub - vocho/openqnx: mirror of git://git.code.sf.net/p/monartis/openqnx http://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.adaptivepartitioning.userguide/topic/about_howtouseguide_.html ap是对进程和线程集合分配最小的系统资源&#xff0c;目…

基于nodejs+vue宿舍管理系统python-flask-django-php

随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建宿舍管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种楼宇信息、宿舍信息、宿舍安排、缺勤信息等于一…

OceanBase中NOT EXISTS是否需要被改写

作者简介 张瑞远&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证包括 Oce…

直播预告丨困气排气解决新方案--毅速金属3D打印随形透气钢

您是否也遇到过这些问题 模具困气造成产品出现注塑瑕疵&#xff0c;但复杂的产品形状导致无法开排气槽 常规透气钢需要拆镶件导致工件强度下降 某些工件部分不接受分模线区域无法拆镶件无法使用常规透气钢 面对越来越复杂的产品和结构&#xff0c;越来越多需要透气、保压、…

全网最新网络安全自学路线,最详细没有之一!!!

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#xff09; 1…

Spring 面试——restcontroller/requestmapping

RestController Controller ResponseBody Controller&#xff1a;包含Component&#xff0c;把当前类声明成为一个 bean ResponseBody&#xff1a;表示方法返回的结果直接作为 HTTP 响应的内容&#xff0c;不是返回视图 3.RequestMapping注解的基本用法_哔哩哔哩_bilibili

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

如何本地部署Imagewheel并实现无公网IP远程连接打造个人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

域名SSL证书怎么获取?

获取域名证书的步骤如下&#xff1a; 选择认证机构&#xff1a;域名证书必须从受信任的认证机构(CA)中申请&#xff0c;如JoySSL、GeoTrust、、Thawte等。收集信息&#xff1a;在申请域名证书之前&#xff0c;需要准备一些证明信息&#xff0c;如域名认证等。创建CSR&#xff…

【ARXIV2402】MambaIR

这个工作首次将 Mamba 引入到图像修复任务&#xff0c;关于为什么 Mamba 可以用于图像修复&#xff0c;作者有非常详细的解释&#xff1a;一路向北&#xff1a;性能超越SwinIR&#xff01;MambaIR: 基于Mamba的图像复原基准模型 作者认为Mamba可以理解为RNN和CNN的结合&#xf…

实战 | 微调训练TrOCR识别弯曲文本

导 读 本文主要介绍如何通过微调训练TrOCR实现弯曲文本识别。 背景介绍 TrOCR&#xff08;基于 Transformer 的光学字符识别&#xff09;模型是性能最佳的 OCR 模型之一。在我们之前的文章中&#xff0c;我们分析了它们在单行打印和手写文本上的表现。 TrOCR—基于Transforme…

基于ARM 的Linux系统的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在 MacOS 中安装 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告 本教程可以包含过时的信息。 此步骤已在 Ubuntu Linux 12.04 上进行了测试&#xff0c;但应…

跳蚱蜢(蓝桥杯)

文章目录 跳蚱蜢题目描述答案&#xff1a;20bfs 跳蚱蜢 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff1a; 有 9 只盘子&#xff0c;排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢&#xff…

JVM 基础知识

JAVA code加载执行顺序&#xff1a; *.java --->*.class->类装载子系统、字节码执行引擎 JVM虚拟机组成&#xff1a; 堆、方法区&#xff08;元空间&#xff09;、栈&#xff08;线程&#xff09;、本地方法栈、程序计数器 栈帧组成&#xff1a; 栈帧&#xff1a;局部…

管理类联考–复试–管理类知识–计划

决策是管理的核心&#xff0c;决策是计划的前提&#xff0c;计划是管理的首要职能&#xff0c;战略是一种计划。 #mermaid-svg-kwa82umCx6PXrp8x {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kwa82umCx6PXrp8x .e…

Linux操作系统及进程(三)进程优先级及特性

目录 一、优先级概念 二、查看系统进程 三、进程切换 一、优先级概念 1.cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。…