首页 > 其他分享 >Leetcode面试经典150题-76.最小覆盖子串

Leetcode面试经典150题-76.最小覆盖子串

时间:2024-09-08 15:51:41浏览次数:14  
标签:count 150 right countMap 76 sArr tArr Leetcode left

解法都在代码里,不懂就留言或者私信

理论上提交这个就是最优解

class Solution {
    public String minWindow(String s, String t) {
        if(s.length() < t.length()) {
            return "";
        }
        /**转成字符数组 */
        char[] sArr = s.toCharArray();
        char[] tArr = t.toCharArray();
        /**其他情况我们构建一个一个欠账表,这里可以用hashMap,也可以使用数组
        hashMap可能更直观一些,我们还有一个遍历count用来记录我们一共欠了多少*/
        Map<Character, Integer> countMap = new HashMap<>();
        int count = tArr.length;
        for(int i = 0; i < tArr.length ; i++) {
            countMap.put(tArr[i], countMap.getOrDefault(tArr[i], 0) + 1);
        }
        /**本题我们使用滑动窗口解题,left是左边界(包含),right是右边界(不包含)
        窗口就是[left, right),开始值都是0,代表还没有任何数据*/
        int left = 0, right = 0;
        /**遍历字符串s,进行还款 */
        int minWidth = Integer.MAX_VALUE;
        /**记录得到最小值时的开始和结束的下标 */
        int minStartIndex = 0;
        int minEndIndex = 0;
        while(right < sArr.length) {
            /**只要还是还完的状态就不断的缩小窗口,直到欠债,我们现在就尝试让窗口缩小(left右移),但是我们缩小之前需要记录一下当前的窗口大小 */
            while(count == 0) {
                minWidth = Math.min(minWidth, right - left);
                /**如果当前窗口长度就是整个的最小长度,那更新得到最小值时的开始和结束的下标为当前窗口的开始和结束 */
                if(minWidth == right - left) {
                    minStartIndex = left;
                    minEndIndex = right;
                }
                /**如果left位置这个字符是tArr里右的并且我们当前没有多还,那left退出之后我们实际欠的就多了一个
                如果这个字符不是tArr里真实存在的那就不管*/
                if(countMap.containsKey(sArr[left])) {
                    /**有效字符并且之前没有多还,count就增多了1个 */
                    if(countMap.get(sArr[left]) >= 0) {
                        count ++;
                    }
                    countMap.put(sArr[left], countMap.get(sArr[left]) + 1);
                }
                left ++;
            }
            /**走到这肯定是欠债状态,那就尝试right右扩增大窗口试试能不能还上*/
            if(countMap.containsKey(sArr[right])) {
                /**如果原来确实欠了这个位置的字符才会影响count */
                if(countMap.get(sArr[right]) > 0) {
                    count --;
                }
                countMap.put(sArr[right], countMap.get(sArr[right]) - 1);
            }
            right ++;
        }
        /**走出循环如果还是不欠债,试试能不能让窗口在不再次负债的情况下缩小*/
        while(count == 0) {
            minWidth = Math.min(minWidth, right - left);
            if(minWidth == right - left) {
                minStartIndex = left;
                minEndIndex = right;
            }
            /**如果left位置这个字符是tArr里右的并且我们当前没有多还,那left退出之后我们实际欠的就多了一个
            如果这个字符不是tArr里真实存在的那就不管*/
            if(countMap.containsKey(sArr[left])) {
                /**有效字符并且之前没有多还,count就增多了1个 */
                if(countMap.get(sArr[left]) >= 0) {
                    count ++;
                }
                countMap.put(sArr[left], countMap.get(sArr[left]) + 1);
            }
            left ++;
        }
        /**如果最后有答案的话返回得到最小值时的窗口*/
        return minWidth == Integer.MAX_VALUE? "" : s.substring(minStartIndex, minEndIndex);
    }
}

 

标签:count,150,right,countMap,76,sArr,tArr,Leetcode,left
From: https://blog.csdn.net/Chang_Yafei/article/details/141990940

相关文章

  • 代码随想录算法训练营第九天 | Javascript | 力扣Leetcode | 手撕KMP的一天 | 28. 找
    目录前言简介题目链接:28.找出字符串中第一个匹配项的下标题目链接:459.重复的子字符串前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄弱。......
  • 392. 判断子序列(leetcode)
    https://leetcode.cn/problems/is-subsequence/description/classSolution{publicbooleanisSubsequence(Strings,Stringt){//依据题意,可以判断是求最长公共子序列的特殊情况//f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+1)//f[1]......
  • LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现N*K时间复杂度
    3177.求出最长好子序列II题目链接题目描述给你一个整数数组nums和一个非负整数k。如果一个整数序列seq满足在下标范围[0,seq.length-2]中最多只有k个下标i满足seq[i]!=seq[i+1],那么我们称这个整数序列为好序列。请你返回nums中好子序列的最长长度......
  • Leetcode 第 409 场周赛题解
    Leetcode第409场周赛题解Leetcode第409场周赛题解题目1:3242.设计相邻元素求和服务思路代码复杂度分析题目2:3243.新增道路查询后的最短距离I思路代码复杂度分析题目3:3244.新增道路查询后的最短距离II思路代码复杂度分析题目4:3245.交替组III思路代码复杂度......
  • LCP 485. 最大连续 1 的个数[lleetcode -11]
    从今天起,我们的算法开始研究搜索,首先就是DFS深度优先搜索(depth-firstseach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍历;因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。对于树结构而言,由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进......
  • Leetcode 029 两数相除
    给你两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345将被截断为8,-2.7335将被截断至-2。返回被除数dividend除以除数divisor得到的商。注意:假设我们的环境只能......
  • 【Golang】LeetCode面试经典150题:45. 跳跃游戏 II
    题干:给定一个长度为 n 的 0索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i+j] 处:0<=j<=nums[i] i+j<n返回到达 nums[n-1] 的最小跳跃次数......
  • CSSE7610  The algorithm  exclusive acces
    CSSE7610        Assignment 11.  A bounded buffer is frequently implemented as a circular buffer, which isan array that is indexed modulo its length: One variable,in,containstheindexofthefirstemptyspaceandan......
  • LeetCode刷题 堆
    一:堆1、一种二叉树的结构(完全二叉树)2、完全二叉树:从上到下;从左到右;填满3、最大堆:根节点的权值大于孩子节点4、最小堆:根节点的权值依次小于孩子节点5、常用操作#创建堆(最大堆,最小堆)#添加元素#获取堆顶元素#删除堆顶元素#堆的长度#堆的遍历二:刷题215数组中的第K个最......
  • 【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】
    ......