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

76. 最小覆盖子串

时间:2023-07-25 13:55:49浏览次数:25  
标签:子串 字符 int ++ 最小 len 76 mp

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。


示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

> 思路
滑动窗口

> 代码

class Solution {
public:
    string minWindow(string s, string t) {
        int len1 = s.size();
        int len2 = t.size();
        if(len1 < len2) return "";
        unordered_map<char,int> mp_s;
        unordered_map<char,int> mp_t;
        for(const auto& c:t){
            mp_t[c]++;
        }
        int l = 0;
        int r = 0;
        int valid = 0;
        int start = 0;
        int len_r = INT_MAX;
        while(r < len1){
            // c是要移入窗口的字符
            char c = s[r];
            // 右移指针
            r++;
            // 进行窗口更新
            if(mp_t.count(c)){
                mp_s[c]++;
                if(mp_s[c] == mp_t[c]){
                    valid++;
                }
            }
            //判断左侧窗口需要收缩
            while(valid == mp_t.size()){
                // 在这里更新最小覆盖子串
                if(r - l < len_r){
                    start = l;
                    len_r = r - l;
                }
                // d是将移出窗口的字符
                char d = s[l];
                //窗口左移
                l++;
                // 进行窗口更新
                if(mp_t.count(d)){
                    if(mp_t[d] == mp_s[d]){
                        valid--;
                    }
                    mp_s[d]--;
                }
            }
        }
        return len_r == INT_MAX?"":s.substr(start,len_r);
    }
};

标签:子串,字符,int,++,最小,len,76,mp
From: https://www.cnblogs.com/lihaoxiang/p/17579704.html

相关文章

  • 题解 P7679 【[COCI2008-2009#5] JABUKA】
    postedon2021-07-0717:38:14|under题解|source设题目中分给每个朋友的苹果数为\(x\),显然有\(x\vertr\landx\vertg\),也就是\(x\vert\gcd(r,g)\)。我们都知道,如果\(a\timesb=c\),那\(a\)和\(b\)都是\(c\)的因数,也就是说因数都是成对出现的(注意特判完全平方......
  • 还原窗口 取消最小化
    #include<Windows.h>intmain(){//获取目标窗口的句柄HWNDhWnd=FindWindow(nullptr,L"1111111");if(hWnd!=nullptr){//将窗口还原(取消最小化)ShowWindow(hWnd,SW_RESTORE);//激活窗口并将其带到前台SetForegr......
  • kmp与最小循环节
    #include<iostream>#include<string.h>#include<vector>usingnamespacestd;constintN=1e6+10,INF=0x3f3f3f3f;chars2[N];intd[N];//d[i]表示以i结尾的字符串中最大公共前后缀的长度voidinit()//得到模式串的d[]下标是从0开始的{intlen=strlen(s2);......
  • LeetCode 热题 100 之 3. 无重复字符的最长子串
    题目给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度为1。示例3:......
  • 560. 和为 K 的子数组(前缀和解决子串问题)
    给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的连续子数组的个数。示例1:输入:nums=[1,1,1],k=2输出:2>思路每个元素对应一个“前缀和”遍历数组,根据当前“前缀和”,在map中寻找「与之相减==k」的历史前缀和当前“前缀和”与历史前缀和......
  • 最小环问题
    问题定义从一个点出发,经过一条简单路径回到起点成为环.图的最小环就是所有环中长度最小的解决思路在所有环中取最小值,按照集合的思路,首先对环进行分类-按照环上点的最大编号来对整个集合进行划分Floyd算法的最外层循环恰好对更新一条线路的节点编号做出了限制,假设此时外层循环......
  • ERROR 1709 (HY000): Index column size too large. The maximum column size is 767
    MySQL版本5.6.35在一个长度为512字符的字段上创建uniquekey报错CREATEDATABASEdpcs_metadataDEFAULTCHARACTERSETutf8;select*frominformation_schema.SCHEMATA;+--------------+--------------------+----------------------------+------------------------+---......
  • Matlab中的偏最小二乘法(PLS)回归模型,离群点检测和变量选择|附代码数据
    全文下载:http://tecdat.cn/?p=22319最近我们被客户要求撰写关于偏最小二乘法(PLS)回归的研究报告,包括一些图形和统计输出。本文建立偏最小二乘法(PLS)回归(PLSR)模型,以及预测性能评估。为了建立一个可靠的模型,我们还实现了一些常用的离群点检测和变量选择方法,可以去除潜在的离群点和只......
  • HJ75 公共子串计算
    1.题目读题 HJ75 公共子串计算 考查点 同  HJ65 查找两个字符串a,b中的最长公共子串HJ65查找两个字符串a,b中的最长公共子串2.解法思路 代码逻辑 具体实现 自行实现publicclassHJ075{publicstaticvoidmain(String[]args){Scanne......
  • HJ65 查找两个字符串a,b中的最长公共子串
    1.题目读题 HJ65 查找两个字符串a,b中的最长公共子串 考查点 2.解法思路 代码逻辑 具体实现自行实现 publicclassHJ065{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(dp(sc.n......