首页 > 其他分享 >76. 最小覆盖子串(困难)

76. 最小覆盖子串(困难)

时间:2024-04-01 18:11:06浏览次数:15  
标签:子串 HashMap int 最小 76 length vs 缩短 charAt


核心思想
滑动窗口,先从头开始找到包含t的子串,然后缩短窗口左边界,直到不包含再扩展右边界。
匹配过程:
s = "ADOBECODEBANC", t = "ABC"
匹配:"ADOBEC"
缩短:"DOBEC"
匹配:"DOBECODEBA"
缩短:"ODEBA"
匹配:"ODEBANC"
缩短:"ANC"
缩短过程中记录答案
代码

public String minWindow(String s, String t) {
        int res = s.length() + 1, resL = -1, resR = -1;
        HashMap<Character, Integer> vs = new HashMap();
        HashMap<Character, Integer> vt = new HashMap();
        for(int i = 0; i < t.length(); i++){
            vt.put(t.charAt(i), vt.getOrDefault(t.charAt(i), 0) + 1);
        }
        int cnt = 0, target = t.length();
        for(int l = 0, r = 0; r < s.length(); r++){
            vs.put(s.charAt(r), vs.getOrDefault(s.charAt(r), 0) + 1);
            if(vs.get(s.charAt(r)) <= vt.getOrDefault(s.charAt(r), 0)){
                cnt++;
            }
            if(cnt == target){
                while(true){
                    if(r - l + 1 < res){
                        res = Math.min(res, r - l + 1);
                        resL = l;
                        resR = r;
                    }
                    char ch = s.charAt(l);
                    vs.put(ch, vs.get(ch) - 1);
                    l++;
                    if(vs.get(ch) < vt.getOrDefault(ch, 0)){
                        cnt--;
                        break;
                    }
                }
            }
        }
        return resL == -1? "": s.substring(resL, resR + 1);
    }
}

标签:子串,HashMap,int,最小,76,length,vs,缩短,charAt
From: https://www.cnblogs.com/ganyq/p/18109079

相关文章

  • 2673. 使二叉树所有路径值相等的最小代价
    思路先看3节点的子树,想要路径值相同,只能修改叶子节点的值,如上图只能2去+1操作。核心思想:那么对于任意左右孩子节点,想要从根节点下来的路径相同,只能修改孩子节点。所以我们只需要从下至上记录叶子节点到当前节点的路径值,然后计算当前节点和右节点的差值。详细看灵神树上贪心......
  • 机器视觉学习(十一)—— 最小矩形和圆形区域、近似轮廓、凸包
    目录一、最小矩形区域与最小圆形区域 1.1 cv2.minAreaRect()函数1.2 cv2.minEnclosingCircle()函数1.3 最小矩形区域与最小圆形区域示例二、显示近似轮廓2.1 cv2.approxPolyDP()函数2.2显示近似轮廓示例代码2.2.1简约版 2.2.2 进阶版 三、显示凸包3.1 ......
  • Offer必备算法17_子数组子串dp_八道力扣题详解(由易到难)
    目录①力扣53.最大子数组和解析代码②力扣918.环形子数组的最大和解析代码③力扣152.乘积最大子数组解析代码④力扣1567.乘积为正数的最长子数组长度解析代码⑤力扣413.等差数列划分解析代码⑥力扣978.最长湍流子数组解析代码⑦力扣139.单词拆分解析代码......
  • EfficientNetV2:谷歌又来了,最小的模型,最高的准确率,最快的训练速度 | ICML 2021
     论文基于training-awareNAS和模型缩放得到EfficientNetV2系列,性能远优于目前的模型。另外,为了进一步提升训练速度,论文提出progressivelearning训练方法,在训练过程中同时增加输入图片尺寸和正则化强度。从实验结果来看,EfficientNetV2的效果非常不错。来源:晓飞的算法工程笔记......
  • Leetcode 回文子串
    Day16学习中心扩展法classSolution{publicintcountSubstrings(Strings){//从中心扩展,intcount=0;intn=s.length();//字符串长度分奇数和偶数,但回文中心的可能性是确定的//枚举所有的回文中心......
  • 【每周例题】力扣 C++ 二叉树的最小深度
    二叉树的最小深度题目二叉树的最小深度题目分析1.首先我们可以处理最小深度为0与最小深度为1的情况:最小深度为0:头结点为空;root==nullptr最小深度为1:root->left==nullptr&&root->right==nullptr2.接下来分为左右子树处理,我们可以用递归来计算最小深度3.最后比较左......
  • 代码随想录算法训练营第36天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
    435.无重叠区间题目链接:无重叠区间题目描述:给定一个区间的集合intervals,其中intervals[i]=[starti,endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。解题思想:这道题目和射气球很像。*“需要移除区间的最小数量,使剩余区间互不重叠”*等效于求重叠区......
  • 746. 使用最小花费爬楼梯
    746.使用最小花费爬楼梯##题目题解classSolution{publicintminCostClimbingStairs(int[]cost){int[]dp=newint[cost.length+1];dp[0]=0;dp[1]=0;for(inti=2;i<cost.length+1;i++){dp[i]=Math.min(dp[i......
  • DIjkstra进阶模板 路径记录 按权重(结点数最小等)记录
    structDIJ{usingi64=longlong;usingPII=pair<i64,i64>;vector<i64>dis,path,node;vector<vector<array<int,3>>>G;intn;DIJ(){}DIJ(intn):n(n){node.resize(n+1,1);......
  • 子串分值
    一、题目描述P8715[蓝桥杯2020省AB2]子串分值二、问题简析记录字符串\(s\)的第\(i\)个字符\(s_i\)(\(0\leqi<s.size\))上一次出现的位置\(pre_i\)、下一次出现的位置\(nex_i\),仅包含\(s_i\)的字串个数为\((i-(pre_i+1)+1)*(nex_i-1-i+1)\),即\((i......