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

Leetcode 76. 最小覆盖子串

时间:2024-02-27 09:46:45浏览次数:16  
标签:子串 字符 right correct 76 smap Leetcode left

题目描述(难度hard)

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""。
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。

解题思路

该题使用滑动窗口和两个哈希表,通过移动左右指针维护窗口,通过比较不断t和窗口字符出现频次找到包含 t 所有字符的最小子串

PS:为避免每次都要花费O(k)判断当前窗口字符出现包含t所有字符,使用变量correct记录有效字符出现次数,等于t.size后再判断是否是最小子串

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map <char,int> smap,tmap;
        string ans = s;
        for(auto c:t){
            tmap[c]++;
        }
        
        int left=0,correct=0;
        for(int right=0;right<s.length();right++){
            //smap维护当前窗口中字符出现数的哈希表
            smap[s[right]]++;
            //当前rigth对应s的字符是t中的字符并且还没有冗余,是有效添加
            if(tmap[s[right]] >= smap[s[right]]){//>=是因为先做的smap[s[right]]++;
                correct++;
            }
            //如果left对应的字符冗余,窗口就右移
            while(left < right && smap[s[left]] > tmap[s[left]]){
                --smap[s[left++]];
                //冗余——1.字符不在t中,不需要改动correct
                //2.字符在t中但过多了,直接去掉不需要改动correct
            }
            //如果窗口内的字符已经满足t串所有字符
            if(correct == t.size()){
                if(right-left+1 < ans.size()){
                    ans = s.substr(left,right-left+1);
                }
            }
        }
        if(correct < t.size())ans = "";
        return ans;
    }
};

标签:子串,字符,right,correct,76,smap,Leetcode,left
From: https://www.cnblogs.com/neromegumi/p/18036189

相关文章

  • 【算法】【字符串】无重复字符的最长子串
    1 题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子字符串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子字符串是"b......
  • LeetCode二分查找 swift 面试
     funcbinarySearch(_array:[Int],_target:Int)->Int?{varleft=0varright=array.count-1whileleft<=right{letmid=(left+right)/2ifarray[mid]==target{returnmid......
  • Go 100 mistakes - #76: time.After and memory leaks
       ......
  • Leetcode刷题第十四天-动态规划
    674:最长连续递增序列链接:674.最长连续递增序列-力扣(LeetCode)1classSolution:2deffindLengthOfLCIS(self,nums:List[int])->int:3n=len(nums)4dp=[1]*n5if(n<1):return06foriinrange(1,n):7if......
  • LeetCode] 2476. Closest Nodes Queries in a Binary Search Tree
    Youaregiventherootofabinarysearchtreeandanarrayqueriesofsizenconsistingofpositiveintegers.Finda2Darrayanswerofsizenwhereanswer[i]=[mini,maxi]:miniisthelargestvalueinthetreethatissmallerthanorequaltoqueries[......
  • Leetcode刷题第十三天-动态规划
    198:打家劫舍链接:198.打家劫舍-力扣(LeetCode)线性数组1classSolution:2defrob(self,nums:List[int])->int:3#dp[i]偷房间i能获得的最大价值4#推导公式dp[i]=max(dp[i-2]+nums[i],dp[i-1]):dp[i-1]不偷房间i,dp[i-2]+nums[i]偷房间i5......
  • 【leetcode】数组篇刷题 --滑动窗口
    /**@lcapp=leetcode.cnid=209lang=cpp**[209]长度最小的子数组*找最短的子数组*///@lccode=startclassSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){//滑动窗口,//一个计算总和intsum=0;......
  • Leetcode 560 和为k的子数组
    Problem:560.和为K的子数组难点怎么通过前缀和找到和为k的子数组如官方题解所言,[j···i]的子数组=k可转化为pre[i]-pre[j-1]==k要找到前缀和找到和为k的子数组个数就是“找到当前前缀和pre[i]-之前求得的前缀和=k”的总情况。我们通过哈希表记录每个前缀和(的值)出......
  • 高颜值小板!华硕ROG STRIX B760-G GAMING WIFI S小吹雪评测:稳上8000!
    一、前言:连细节都尽善尽美的高颜值小吹雪主板在一众B760主板中,华硕的B760小吹雪在颜值、性能和做工方面做到了很好的平衡,很多想要打造白色小型主机的玩家都会首选这块主板。现在,升级版的ROGSTRIXB760-GGAMINGWIFIS小吹雪来了。ROGSTRIXB760-GGAMINGWIFIS小吹雪主板......
  • 代码随想录 day60 回文子串 最长回文子序列
    回文子串dp[i][j]:[i,j]范围内为回文子串递推式分三种情况①:ij相等显然是回文②:j-i<1且s[i]==s[j]显然是回文③:j-i>1且dp[i+1][j-1]为true也就是当前两端元素相同看元素内部是否是回文如果是显然是ij范围内是回文初始化必须初始化falset......