首页 > 其他分享 >最小覆盖子串

最小覆盖子串

时间:2024-07-01 16:56:55浏览次数:3  
标签:子串 字符 覆盖 最小 字符串 window need left

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

解题思路

经典的滑动窗口问题,滑动窗口问题经常用于解决连续字串问题,设置left和right指针不断滑动,找到最后需要的结果

难点:左指针移动条件需要清晰明确

滑动窗口模板具体参考我的上一篇找到字符串中所有字母异位词-CSDN博客

解题

本题的左指针移动根据

        当前窗口中是否包含所需的全部字符串,并且长度要为最小

明确左指针移动条件,代码附上

class Solution {
    public String minWindow(String s, String t) {
        int left = 0, right = 0;
        int min = s.length(); //用于存储最短的长度
        int minIndex = -1;    //用于存储最小字串的左索引值
        int targe = 0;

        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();

        //将字串t放入need集合中
        for(Character c : t.toCharArray()) need.put(c, need.getOrDefault(c, 0) + 1);

        while(right < s.length()) {
            char c = s.charAt(right++);

            //若need中包含所需字符,放入窗口中,并判断是否等于need的值
            if(need.containsKey(c)) {
                window.put(c, window.getOrDefault(c, 0) + 1);
                //由于存储的是Integer类型的值,用==比较不是比较值,也会比较对象
                if(need.get(c).equals(window.get(c))) {
                    targe++;
                }
            }

            //当targe等于need的长度,代表当前窗口中已经包含全部的t的字符
            while(targe == need.size()) {
                //判断当前的rigt - left即当前窗口长度,若小于,代表找到一个长度更短的子串
                if(min >= right - left){
                    minIndex = left;
                    min = right - left;
                }

                c = s.charAt(left++);

                //确定目标是否还包括全部目标字符串
                if(need.containsKey(c)) {
                    if(need.get(c).equals(window.get(c))) 
                        //已经不包括了,将targe--
                        targe--;
                    //再将窗口中的当前字符的value值-1
                    window.put(c, window.get(c) - 1);
                }

            }
        }
        //若minIndex为-1代表没找到这个子串,返回"",找到就将s截取,返回
        return minIndex == -1 ? "" : s.substring(minIndex, minIndex + min);
    }
}

标签:子串,字符,覆盖,最小,字符串,window,need,left
From: https://blog.csdn.net/STARSpace8888/article/details/140102179

相关文章

  • 使用GCOV和LCOV测试C++代码覆盖率
    使用GCOV和LCOV测试C++代码覆盖率目录使用GCOV和LCOV测试C++代码覆盖率1.GCOV和LCOV简介2.GCOV和LCOV安装3.GCOV+LCOV测试代码覆盖率1.GCOV和LCOV简介GCOV是一个测试代码覆盖率的工具,可以与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分。......
  • 每日一题——Python实现PAT乙级1023 组个最小数(举一反三+思想解读+逐步优化)五千字好文
    一个认为一切根源都是“自己不够强”的INTJ个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数Python-3.12.0文档解读目录 我的写法(刚学Python时)代码点评时间复杂度分析空间复杂度分析总结我要更强优化建议优化后的代码时间复杂......
  • 3170 找出最小公倍数
    解法一:循环找#include<bits/stdc++.h>#definef(i,s,e)for(inti=s;i<=e;i++)#definelllonglongusingnamespacestd;constintN=1e3+10,inf=0x3f3f3f3f;intmain(){intn,m;cin>>n>>m;for(inti=n;i<=n*m;......
  • (线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改
    题意:code:#pragmaGCCoptimize("O3")#pragmaGCCoptimize("Ofast")#pragmaGCCoptimize("unroll-loops")#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingu64=unsignedlonglong;usingPII=p......
  • 这个大纲涵盖了从基础到高级的 Log Parser 使用技巧和实践,帮助用户全面掌握这一强大的
    LogParser是一个功能强大的工具,用于处理和分析各种日志文件和数据源。以下是一个初级使用教程的大纲,帮助你快速入门和理解其基本功能和用法:1. 介绍和安装什么是LogParser?LogParser是一种强大的命令行工具,用于从多种日志文件、事件日志、CSV文件以及其他结构化数据......
  • 【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解
    最小生成树的实际应用背景。最节省经费的前提下,在n个城市之间建立通信联络网。Kruskal算法(基于并查集)voidinit(){for(inti=1;i<=n;i++){pre[i]=i;}}llroot(lla){lli=a;while(pre[i]!=i){i=pre[i];......
  • 代码随想录DAY2|有序数组的平方|长度最小的子数组|螺旋矩阵II
    有序数组的平方有序数组的平方解题思路最优的解法是通过双指针,由于该数组是一个非递减数列,我们只需要将数组的首尾两端作为两个指针的起始位置,然后进行比较就行。具体地讲,双指针所指向的值相互比较,把较大的值放入新的数组的开通,然后该指针往前(如果是在首端的指针,则往后)。重复这......
  • LeetCode 209.长度最小的子数组
    链接209.长度最小的子数组-力扣(LeetCode)题目给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组[numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示......
  • 【数学】100332. 包含所有 1 的最小矩形面积 II
    本文涉及知识点数学LeetCode100332.包含所有1的最小矩形面积II给你一个二维二进制数组grid。你需要找到3个不重叠、面积非零、边在水平方向和竖直方向上的矩形,并且满足grid中所有的1都在这些矩形的内部。返回这些矩形面积之和的最小可能值。注意,这些......
  • 图片覆盖攻击
    点击劫持的本质是一种视觉欺骗。顺着这个思路,还有一些攻击方法也可以起到类似的作用,比如图片覆盖。一名叫sven.vetsch的安全研究者最先提出了这种CrossSiteImageOverlaying攻击,简称XSIO。sven.vetsch通过调整图片的style使得图片能够覆盖在他所指定的任意位置。<......