LeetCode:76. 最小覆盖子串 | JavaScript解题

简介: LeetCode:76. 最小覆盖子串 | JavaScript解题

76. 最小覆盖子串

难度困难2122

给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。
复制代码

 

提示:

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

 

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


思路

官方解题

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
    // 左右指针
    let left = 0;
    let right = 0;
    const map = new Map()
    // 记录t字符串
    for(let i of t) {
        map.set(i,map.has(i) ? map.get(i) + 1 : 1);
    }
    // 字母类型总数
    let Types = map.size; 
    // 返回字符串
    let res  = '';
    while(right < s.length) {
        // 先跑right指针
        let c = s[right];
        if(map.has(c)) {
            map.set(c,map.get(c) - 1)
            if(map.get(c) == 0) Types--;
        }
        // 满足t字符串就跑left指针
        while(Types == 0) {
            let newRes = s.substring(left,right+1);
            // 遇到更短的就更新res
            if(!res || newRes.length < res.length) {
                res = newRes;
            }
            // 跑left指针,知道left到right之间不满足t字符串
            let c2 = s[left];
            if(map.has(c2)) {
                map.set(c2,map.get(c2)+1);
                if(map.get(c2) == 1) Types++;
            }
            left++
        }
        right++;
    }
    return res;
};



目录
相关文章
|
8月前
|
Go
golang力扣leetcode 76.最小覆盖子串
golang力扣leetcode 76.最小覆盖子串
64 0
|
3月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
98 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
7月前
|
存储 算法 测试技术
力扣经典150题第三十三题:最小覆盖子串
力扣经典150题第三十三题:最小覆盖子串
67 1
|
7月前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
7月前
|
存储 JavaScript 前端开发
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
35 1
|
7月前
|
算法 测试技术 索引
力扣经典150题第三十二题:串联所有单词的子串
力扣经典150题第三十二题:串联所有单词的子串
33 0
|
7月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
7月前
|
存储 算法 数据挖掘
高效搜索技巧:最小覆盖子串解法【力扣75题 python】
高效搜索技巧:最小覆盖子串解法【力扣75题 python】
|
7月前
|
存储 算法 数据挖掘
LeetCode 题目 30:串联所有单词的子串【python】
LeetCode 题目 30:串联所有单词的子串【python】
|
8月前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
44 0