leetcode76. 最小覆盖子串

题目描述

链接: leetcode76.

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

注意:

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

示例1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"

示例2:
输入:s = "a", t = "a" 输出:"a"
示例3:

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

题解

滑动窗口: 在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口

  • java解法
    public String minWindow(String s, String t) {Map<Character, Integer> targetStrMap = new HashMap<>(); // 目标字符串t的字符和个数mapMap<Character, Integer> window = new HashMap<>(); // 当前窗口的字符和个数mapint tLen = t.length(); // 模板字符串长度for (int i = 0; i < tLen; i++) { char c = t.charAt(i);targetStrMap.put(c, targetStrMap.getOrDefault(c, 0) + 1);}int l = 0; // 左指针int r = -1; // 右指针int len = Integer.MAX_VALUE; // 当前字符串长度int ansL = -1; // 当前字符串左边索引int ansR = -1; // 当前字符串右边索引int sLen = s.length();while (r < sLen) { // 右指针走到最末尾时停止++r;if (r < sLen && targetStrMap.containsKey(s.charAt(r))) { // 如果r位置包含目标字符串的字符window.put(s.charAt(r), window.getOrDefault(s.charAt(r), 0) + 1);}while (isValidWindow(targetStrMap, window) && l <= r) { // 判断Window里面的字符是否符合要求了if (r - l + 1 < len) {len = r - l + 1;ansL = l;ansR = l + len;}if (targetStrMap.containsKey(s.charAt(l))) { // 如果l位置包含目标字符串的字符window.put(s.charAt(l), window.getOrDefault(s.charAt(l), 0) - 1);}++l;}}return ansL == -1 ? "" : s.substring(ansL, ansR);}public boolean isValidWindow(Map<Character, Integer> ori, Map<Character, Integer> cnt) {for (Map.Entry<Character, Integer> entry : ori.entrySet()) {Character key = entry.getKey();Integer val = entry.getValue();if (cnt.getOrDefault(key, 0) < val) {return false;}}return true;}
  • golang解法
func minWindow(s string, t string) string {targetStrMap, window := map[byte]int{}, map[byte]int{}left, right, ansL, ansR, curLen := 0, -1, -1, -1, int(^uint(0) >> 1)for i := 0; i < len(t); i++ {targetStrMap[t[i]]++}for right < len(s) {right++if right < len(s) && targetStrMap[s[right]] > 0 {window[s[right]]++}for isValidWindow(targetStrMap, window) {if right - left + 1 < curLen {curLen = right - left + 1ansL = leftansR = left + curLen}if targetStrMap[s[left]] > 0 {window[s[left]]--}left++}}if ansL == -1 {return ""}return s[ansL:ansR]
}func isValidWindow(targetStrMap map[byte]int, window map[byte]int) bool {for key, value := range targetStrMap {if window[key] < value {return false}}return true
}

leetcode76. 最小覆盖子串相关推荐

  1. LeetCode-76: 最小覆盖子串

    题目描述: 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意:如果 s ...

  2. leetcode76 最小覆盖子串

    给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC& ...

  3. Leetcode--76. 最小覆盖子串

    给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC& ...

  4. LeetCode76——最小覆盖子串

    题目: 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = " ...

  5. Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析

    题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...

  6. cstring判断是否包含子串_leetcode76. 最小覆盖子串

    leetcode76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串. 示例: 输入: S = "ADOBECODEBANC&qu ...

  7. Leetcode 76最小覆盖子串77组合78子集

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  8. [Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]

    [问题描述][第76题][最小覆盖子串][中等] 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串.示例:输入: S = "ADOBECODEBAN ...

  9. 【LeetCode】【HOT】76. 最小覆盖子串(滑动窗口)

    [LeetCode][HOT]76. 最小覆盖子串 文章目录 [LeetCode][HOT]76. 最小覆盖子串 package hot;public class Solution76 {public ...

最新文章

  1. 小程序统一服务消息_[miniblog]小程序订阅消息踩坑记
  2. TCP服务端收到syn但是不回复syn ack问题分析
  3. 数据结构与算法:二分法
  4. 为人处事的一些小句子。
  5. 公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已
  6. Arturia Prophet Mac音频插件:将Prophet 5,Prophet VS,Prophet Hybrid三种不同音乐合成器于一体
  7. mathmagic pro mac使用教程|快速地创建任何方程
  8. JS面向对象的实现和原理
  9. consul 数据持久化_一起学习Nacos的数据持久化
  10. python selenium 等待元素_python3 selenium 设置元素等待的三种方法
  11. word参考文献交叉引用
  12. 新品发布 | 麒麟产业服务:麒麟云上产业园,打造数字新基建
  13. 如何编写Word文档 多级编号
  14. 团队的Kick off
  15. 记《浪潮之巅》《硅谷之谜》《智能时代》
  16. 无法启动此程序,因为计算机中丢失MSVCRTD.dll(MFC42D.dll, MFCO42D.dll)
  17. Dorabot蓝胖子招聘 薪资Open谈|3D视觉、机器人软件、SLAM算法工程师等岗位
  18. JavaScript 之 核心语法 [ 对象 ]
  19. SSM整合ActiveMQ
  20. 考研复试--数据链路层--计算机网络面试题

热门文章

  1. Keith Hill的Effective Windows PowerShell.pdf下载
  2. 如何用VS2005制作Web安装程序
  3. CAD编辑工具中如何设置图纸的比例
  4. VMware ESX 5.0 网卡负载均衡配置3种方法
  5. 线程轮循打印ABC...
  6. 【译】区块链是如何工作的——用JavaScript演示
  7. phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志
  8. New StoryBoard in iOS9
  9. linux下线程控制
  10. contentProvider 内容提供者