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

76.最小覆盖子串 Golang实现

时间:2024-09-23 20:01:17浏览次数:10  
标签:子串 字符 len Golang 76 targetFreq 哈希 字符串

题目描述:

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

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

题目分析:
看到这类最长最短子串等,则首选滑动窗口方法。按照滑动窗口的方法,重点应该是确定满足要求时窗口的状态: 这里是包含字符串t的所有元素就可以,不要求有序,那么使用哈希表来记录就是很好的办法,同时要求最短,即后续要优化,因为可能T的元素会在s中常重复出现,那么哈希表的值设置为频率就能很好达到——》元素出现,并且频率一次就是最短的状态。因为是字符,所以哈希表设计为 var targetFreq :=map[byte]int。 那么targetFreq的长度就代表了目标字符串的元素种类。

点击查看代码
func minWindow(s string, t string) string {
   if len(s)==0 || len(t)==0{return ""}
   left,right,matchCount:=0,0,0
   start:=0
   minLength := len(s)+1
   targetFreq := make(map[byte]int)
    for i := 0; i < len(t); i++ {
        targetFreq[t[i]]++
    }

    windowFreq := make(map[byte]int)

    for right<len(s){
        charRight := s[right]
        right++
        if _,exists:=targetFreq[charRight];exists{
            windowFreq[charRight]++
            if windowFreq[charRight] == targetFreq[charRight] {
                matchCount++
            }
        }
        for matchCount == len(targetFreq){
        //    尝试缩小边界
            if right-left <minLength{
                minLength = right-left
                start = left
            }
             charLeft:= s[left]
             left++
             if _,exists:=targetFreq[charLeft];exists{
                 if windowFreq[charLeft] == targetFreq[charLeft]{
                     matchCount--
                 }
                 windowFreq[charLeft]--
             }
        }
    }
    if minLength == len(s)+1{return ""}
    return s[start:start+minLength]
}

标签:子串,字符,len,Golang,76,targetFreq,哈希,字符串
From: https://www.cnblogs.com/CharlseGo/p/18427783

相关文章

  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
    前言:贪心的本质选择每一阶段的局部最优,从而达到全局最优。455.分发饼干思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计......
  • 10分钟速成golang
    Go拥有命令式语言的静态类型,编译很快,执行也很快,同时加入了对于目前多核CPU的并发计算支持,也有相应的特性来实现大规模编程。//单行注释/*多行注释*///导入包的子句在每个源文件的开头。//main比较特殊,它用来声明可执行文件,而不是一个库。packagemain//Import......
  • 3. 无重复字符的最长子串 Golang实现
    题目描述给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。注意区分子串和子序列。示例3:输入:s="pwwkew"输出:3解释:因为无重复字符的最长子串是"wke",所以其长度为3。请注意,你的答案必须是子串的长度,"pwke"是一个子序列,不是子串。思路分析:1.......
  • CF 1762 F
    考虑怎么不重不漏的计算每一个区间。可以发现,每一个可行的区间一定是可以找到\(i_1\simi_k\)使\(a_{i_1}\sima_{i_k}\)是单调不增或者不降的。这是因为,考虑有一个地方比两边都要小,那么我们可以直接忽略它,两边的差一定在\(k\)以内。比两边都大同理。因此我们现在就要算单......
  • P3768 简单的数学题
    简单的数学题题目描述由于出题人懒得写背景了,题目还是简单一点好。输入一个整数\(n\)和一个整数\(p\),你需要求出:\[\left(\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)\right)\bmodp\]其中\(\gcd(a,b)\)表示\(a\)与\(b\)的最大公约数。输入格式一行两个整数\(p,n\)。......
  • P6292 区间本质不同子串个数
    Solution与“区间本质不同回文子串个数”类似,但没有等差数列那样优美的性质了……下面是一个更通用的做法。考虑移动一次右端点\(r\),就相当于把parent树上一条到根链的lastendpos设为\(r\).把这个看成access操作.考虑用LCT维护parent树的链,维护一个性质:一条实链......
  • H7.1.4.1. 最短不公共子串
    Statement给两个串\(A,B\),其中\(|A|,|B|\le2000\),计算:\(A\)的最短子串,他不是\(B\)的子串\(A\)的最短子串,他不是\(B\)的子序列\(A\)的最短子序列,他不是\(B\)的子串\(A\)的最短子序列,他不是\(B\)的子序列Solution子序列自动机:\(\delta(u,c)=\min\{i|i>u\land......
  • 最长公共子串 题解
    StatementQ7.1.2.4,时限4s给一个串,定义\(\mathrm{LCS}\)为最长公共子串长度,\(q\)次询问,每次给出\(l,r\),求\[\operatorname{xor}_{i=1}^{r-l+1}\{i+\mathrm{LCS}(S[l,l+i-1],S[l+i-1,r])\}\]\(n\le10^5,q\le30\)Solutiontag:SA,线段树维护分治结构,orzhunction题目就是......
  • 2376.统计特殊整数
    如果一个正整数每一个数位都是互不相同的,我们称它是特殊整数。给你一个正整数n,请你返回区间[1,n]之间特殊整数的数目。示例1:输入:n=20输出:19解释:1到20之间所有整数除了11以外都是特殊整数。所以总共有19个特殊整数。示例2:输入:n=5输出:5解释:1到5......
  • golang 项目引入私有仓库包
    场景:当你多个项目,都需要使用一个或者多个方法,那么可以将公共方法,抽成一个包,进行管理(类似Log模块等)。这时候可以将你的包上传到私有的仓库,其他项目引入该包即可。下面来介绍下,如何引用私有仓库的包。1. 创建一个新的Git标签假设你已经在你的私有GitLab仓库目录中,并且你已经......