双指针滑动窗口整理2——最小覆盖子串

news/2024/5/20 9:21:01 标签: python, leetcode, 算法, 双指针, 滑动窗口

接着上一篇 双指针滑动窗口整理——长度最小的子数组、水果成篮 继续整理。

题目:leetcode.cn/problems/minimum-window-substring/">76. 最小覆盖子串

此题对于滑动窗口的思路其实与之前差不多,难点在于缩放窗口的条件

题意解读:

要点一

  1. 题目中说“*对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。”说明我们需要对t中字母及其个数进行记录,这里我们用字典requiredsub来表示。这也是我们求解的子串所需要包含的单词及其数量。
  2. 在遍历过程中,每次获得一个属于t的单词,就将requiredsub[s[j]] -= 1
  3. 当该字典中所有的字母的值为非正数的时候就是滑动窗口要缩放的时候。

要点二

那如何判断requiredsub中所有元素的值是负数呢?

我们设置了requiredlen,初始化为t的长度。当所求子串还需要更多包含t中元素的时候,(requiredsub[s[j]] > 0)的时候,requiredlen -= 1

  • requiredsub[k]是正数表示子串中还需要几个k元素。0则为不需要,负数则是过剩。

  • 我们举个例子来理解一下,比如s = 'aab' t = 'ab',当i = 0, j = 1requiredsub['a'] = 0,表示子串其实不再需要更多a,所以这时候requiredlen并不需要变化。

要点三

i需要需要变化的时候(向后移动),对于requiredsubrequiredlen有一个与要点二相反的变化。即先判断子串中包含t中的元素是否过剩(如果没有过剩,那么 requiredsub[s[i]] == 0)则requiredlen += 1

python">from collections import Counter
class Solution(object):
    def minWindow(self, s, t):

        minstring = ''
        minlen = len(s) + 1
        requiredsub = Counter(t) #记录需要单词的所需数目
        i = 0
        requiredlen = len(t)

        for j in range(len(s)):
            if s[j] in t:
                if requiredsub[s[j]] > 0: requiredlen -= 1 
                requiredsub[s[j]] -= 1
            while requiredlen == 0:
                curlen = j - i + 1
                if minlen > curlen:
                    minlen = curlen
                    minstring = s[i:j+1]
                if s[i] in t: 
                    if requiredsub[s[i]] == 0: requiredlen += 1
                    requiredsub[s[i]] += 1
                i += 1

        return minstring

http://www.niftyadmin.cn/n/388500.html

相关文章

【map和set的封装】

文章目录 前言1 大致框架2 迭代器3 map和set的封装 前言 上篇博客已经讲解了红黑树插入的模拟实现,这篇文章的目的是利用上节课讲解的底层实现来封装map和set.参考代码借鉴的是STL SGI版本3.0 1 大致框架 首先我们来看看源码里面怎么定义的: 从源码中我们不难发现m…

Docker进阶:Dockerfile,镜像构建与容器编排工具

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:文章 🥭本文内容&am…

C++进阶 —— lambda表达式(C++11新特性)

九,lambda表达式 在C98中,如对一个数据集合中的元素进行排序,可使用sort;如元素为自定义类型,需定义排序时的比较规则;随着C的发展,人们开始觉的上面的写法太复杂了,为了实现一个alg…

招标采购评标专家管理数智化解决方案

评标专家作为评标活动的重要一环,对保证评标活动的公平公正和评标质量,乃至提升营商环境都意义重大。 为了加强招采过程中评标专家的监督管理、健全评标专家库制度,保证评标活动的公平公正,提高评标质量,国家出台了相…

【定时任务】Java 中 8 种定时任务

一、单机定时任务 1、Timer java.util.Timer 类是 JDK1.3 专门提供的定时器工具,用来在执行指定任务,需要跟 TimerTask 一起配合使用 public class Timer {private final TaskQueue queue new TaskQueue();private final TimerThread thread new Tim…

Redis中的哈希结构(Dict)

前言 哈希结构是一个在计算机中非常常见的结构。哈希结构可以让我们在O(1)时间复杂度查找元素并且对其操作,并且增删改查性能并不会随着数据量的增多而改变。反而数据量的增大,会出现两个关键问题,一个是哈希冲突,另一个是rehash…

React中的懒加载以及在Ice中实践

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 前言 对于页面性能优化,组件懒加载是个比较不错的方案,并且在整个项目打包后,如果未做代码分割,构建出的文…

Simulink仿真模块 - Signal Conversion

目录 说明 实例 创建总线信号的连续副本 ​将虚拟总线转换为非虚拟总线 ​