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

76. 最小覆盖子串

时间:2024-11-11 11:21:44浏览次数:1  
标签:子串 map 字符 ++ 最小 76 ans need count

  1. 题目链接

  2. 解题思路

    • 求最小子串问题,第一时间,想「以i开头的结果是什么」,求出所有的结果,最优的便是;或者「以i结尾的结果是什么」,求出所有的结果,最优的便是
    • 这个题使用「以i开头的结果是什么」,假设是[i, j]然后再求i+1的结果时,我们发现,只需要把i位置的字符去掉,就可以知道是否满足结果,如果不满足,我们可以直接把j往后接着找。有点像动态规划的思想,我知道了dp[i],然后dp[i + 1]就可以利用dp[i]的结果,快速得到。
    • 其实这个题是一个「滑动窗口」的问题。i开头,滑到j,也就是[i, j]就是i的结果,然后把i移除窗口,如果仍然满足结果,那i+1的结果就是[i + 1, j],如果不满足,j再右移,就是滑动窗口的做法。
    • 一些细节
      • 1️⃣怎么知道「j滑到哪里才满足」?可以用一个map,key就是某个字符,value就是该字符需要的次数。假设一个map,有map['a'] = 2,a字符需要2次。当遇到a之后,减减,当a减到0的时候,我们就能知道,a这个字符满足了,所以我们还需要用一个变量count记录,有几个字符已经满足了。假设map的大小是5,就说明,一共有5种字符,当count == 5时,就说明全部满足了。
      • 2️⃣得到i的结果[i, j]后,怎么把i移除?如果i在map里,现在i被移除了,所以map中对应的字符要++。
      • 那我怎么知道把i移除之后,i+1是否满足呢?还是count变量,当移除i,i对应的字符在map中,map就要++,如果++后,大于0了,说明,不满足了。所以,这里又有一个问题,1️⃣中,遇到map中的字符,就要减减,减到0后还要减吗?要减!因为i移除之后,map要加加,如果此时还是小于等于0,那就说明i+1还是满足条件的。
      • 总结一下:
        • 当遍历到的字符,是需要的,map中对应的字符就要减减,如果减减后,等于0了,那么count++,当count==5时,就说明满足条件了
        • 当移除i时,如果在map中,那么对应的字符就要加加,如果加加后,大于1了,那么count--,此时j就要往右滑了。
  3. 代码

    class Solution {
    public:
        string minWindow(string s, string t) {
            int ans_len = INT32_MAX;    // 答案的长度
            int ans_index = -1;         // 答案的开始下标
            unordered_map<char, int> need;     // 需要满足的字符
            int count = 0;
            // 构造需要满足的字符
            for (auto &it : t) {
                need[it]++;
            }
            int n = s.size();
            int j = -1;    // 窗口右边界
            for (int i = 0; i < n; ++i) {     // 以i开头的答案是什么?
                // 将i - 1移出窗口
                if (i - 1 >= 0 && need.count(s[i - 1]) != 0) {
                    if (need[s[i - 1]]++ == 0) {   // 等同于need[s[i - 1]]++; if (need[s[i - 1]] > 0)
                        count--;
                    }
                }
                while(j + 1 < n && count != need.size()) {    // 如果不满足条件  j要往右扩
                    j++;
                    if (need.count(s[j]) != 0) {
                        if (need[s[j]]-- == 1) {   // 等同于need[s[j]]--; if (need[s[j]] == 0)
                            count++;
                        }
                    }
                }
                if (count == need.size()) {   // 满足要求
                    if (j - i + 1 < ans_len) {   // 如果能更新
                        ans_len = j - i + 1;
                        ans_index = i;
                    }
                } else {     // j都越界了  还没满足要求  说明满足不了了 后面的也满足不了了
                    break;
                }
            }
            if (ans_index == -1) {   // 没有找到
                return "";
            }
            return s.substr(ans_index, ans_len);
        }
    };
    

标签:子串,map,字符,++,最小,76,ans,need,count
From: https://www.cnblogs.com/ouyangxx/p/18539335

相关文章

  • [1076] Clauses with the pattern "prep + which"
    Clauseswiththepattern"prep+which"areoftenusedtoaddadditionalinformationorclarifyarelationshipbetweentwopartsofasentence.Theseclausesareknownasrelativeclauses.Herearesomeexamplesandexplanations:Examples:In......
  • 64. 最小路径和
    题目链接这道题目与62.不同路径很像,来到[i,j]位置,只能向下,或者向右走,只不过改题是要求总和最小。process(i,j):当前在[i,j]位置,返回最小路径和所以当在[i,j],如果还能往下走,一种答案就是process(i+1,j)+grid[i][j]如果还能往右走,另一种答案就是process(i,j+1)......
  • 并查集+最小生成树 学习笔记+杂题 1
    图论系列:前言:相关题单:戳我算法讲解:戳我代码可能过多啊,到时候页面别卡死了,所以就把代码最前面的缺省源删了(反正就是几个头文件/defineintlonglong,自己加一下即可)。并查集记得初始化,最小生成树记得排序。P3367【模板】并查集板子题,给定\(n\)个元素,有2种操作,一种合并,......
  • 【开源鸿蒙】OpenHarmony 5.0 轻量系统最小开发环境搭建
    本文将会介绍,如何下载源代码和工具链,让磁盘占用尽可能小的同时,还可以进行轻量系统上的OpenHarmony开发(进行源码编译构建)。最终实现了将磁盘占用从完整源码的67G减少到了15G,不到完整源码的四分之一磁盘占用!一、写在前面——为什么写本篇内容OpenHarmony5.0发布了,该版本系......
  • 并查集+最小生成树 学习笔记
    图论系列:前言:咲いた野の花よああどうか教えておくれ人は何故傷つけあって争うのでしょう相关题单:题单1题单2题单3题单4一.并查集1.基础定义与操作(1)定义并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的......
  • 代码随想录算法训练营第18天| 530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数 , 2
    530.二叉搜索树的最小绝对差文章链接:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html视频链接:https://www.bilibili.com/video/BV1DD4y11779/?vd_source=6cb513d59bf1f73f86d4225e9803d47b题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in......
  • Python 潮流周刊#76:用 50 行 Python 代码实现 BASIC(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了11篇文章,12个开源项目,全文2000字。以下是本期摘要:......
  • 算法求解(C#)-- 寻找包含目标字符串的最短子串算法
    1.引言在字符串处理中,我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。2.问题描述给定一个源字符串source和一个目标字符串target,我们需要找......
  • python计算最小二乘法(附代码详细解释)
    最小二乘法(LeastSquaresMethod)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。在回归分析中,其目的是找到一条直线(对于简单线性回归而言)或者一个超平面(对于多元线性回归),使得观测值与预测值之间误差的平方和最小。这种方法拟合直线相对于理论线性拟合直......
  • 第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元
    第八章:8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)思考:1.输入矩阵的值inta[5][5]={0};   inti=0,j=0;   printf("请输入一个5*5的数组:\n");   for(i=0;i<5;......