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

76. 最小覆盖子串

时间:2023-11-17 21:56:19浏览次数:38  
标签:子串 字符 right 最小 len 76 window c1

  1. 最小覆盖子串

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

注意:

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

示例 1:

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

示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成

进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        window = {}  # 记录窗口中的字符
        needs = dict((i, t.count(i)) for i in t) # 记录需要凑齐的字符

        res = []
        left = 0
        right = 0
        
        valied = 0  # 窗口中满足need条件的字符个数

        len_ = float('inf')

        while right < len(s):
            # 增大窗口
            c1 = s[right]
            
            right += 1
            # 进行窗口内数据的一些列更新
            if c1 in needs.keys():
                window[c1] = window.get(c1, 0) + 1
                if window[c1] == needs[c1]:
                    valied += 1
            


            while valied == len(needs):

                if right - left < len_:
                    start = left
                    len_ = right - left
                
                # 缩小窗口
                c2 = s[left]
                left += 1
                
                if c2 in needs.keys():
                    window[c2] -= 1
                    if window[c2] < needs[c2]:
                        valied -= 1
        



        return '' if len_ == float('inf') else s[start:start + len_] 

        

标签:子串,字符,right,最小,len,76,window,c1
From: https://www.cnblogs.com/mrmrwjk/p/17839745.html

相关文章

  • acwing276机器任务的证明
    假设我们已经给每一个任务分配了一种模式了那么相同模式的任务排在一起的时候肯定重启次数最小对涉及到的模式,我们还原回二分图上就是在二分图上尽量选择少的节点(一种模式代表一次重启次数,因为相同模式都是放在一起的),使每一个任务都可以被安排就可以转换为最小点覆盖问题......
  • 求两个数的最小公倍数
    #include<stdio.h>intmain(){  inti,j,k,t=0;  printf("请输入两个数:");  scanf_s("%d,%d",&i,&j);   for(k=1;k<=i*j;k++)  {       if(i%j==0||j%i==0)    {      printf("%d,%d......
  • 最小的 $x$ 满足 $L\le x\bmod P\le R$
    设\(G(L,R,D,P)\)为\(yP+L\leqxD\leqyP+R\),满足\(1\leqL\leqR<P,D<P\),其中\(x\)的最小非负整数解。这是一个模板题,题号是POJ3530,但肯定没多少人见过,这也算是一种类欧几里得算法吧。首先若\(D=0\)那么显然就无解。否则假设\(P=0\),这时候有解,就直......
  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若......
  • 2760
    给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0<=l<=r<nums.length) 且满足以下条件的 最长子数组 :nums[l]%2==0对于范围 [l,r-1] 内的所有下标 i ,nums[i]%2!=......
  • 求删除k个字母后的最小字典序字符串
    对于一个字符串来说我们要找删除k个字母后的最小字典序字符串来说,我们肯定是从前往后来删除,如果遇见前一个字母比后一个字母(字典序)大,那就删除前一个。对于此来说我们用一个vector来维护,vector就是存的答案,如果vector的最后一个字母比枚举的字母大,那就删除最后一个。vector<c......
  • goldengate add trandata显示最小附加日志already enable,但是info trandata显示disabl
    问题描述:数据库版本11.2.0.4,操作系统版本:windowsserver2012,goldengate版本12.1.2.1.0在给ogg同步表添加trandata的时候,提示supplementalredologdataisalreadyenabled。但是使用infotrandata查看的时候,却显示supplementalredologdataisdisabled。  这时通过......
  • 力扣2760. 最长奇偶子数组
    给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0<=l<=r<nums.length) 且满足以下条件的 最长子数组 :nums[l]%2==0对于范围 [l,r-1] 内的所有下标 i ,nums[i]%......
  • 453. 最小操作次数使数组元素相等
    (453.最小操作次数使数组元素相等-力扣(LeetCode))https://leetcode.cn/problems/minimum-moves-to-equal-array-elements/description/题目描述给你一个长度为n的整数数组,每次操作将会使n-1个元素增加1。返回让数组所有元素相等的最小操作次数。 示例1:输入:nums......
  • 图论——最小生成树 学习笔记
    图论——最小生成树学习笔记本文仅对于无向连通图。生成树,SpanningTree(ST),在一个\(n\)个点的图中选取\(n-1\)条边,构成一棵树。最小生成树,MinimumSpanningTree(MST),通常是边权和最小的生成树。算法分类:算法PrimPrim堆优化Kruskal思想加点加点加边时间......