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;
};



目录
相关文章
|
6天前
|
Go
golang力扣leetcode 76.最小覆盖子串
golang力扣leetcode 76.最小覆盖子串
37 0
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
LeetCode 51.N皇后(JavaScript 解题)
LeetCode 51.N皇后(JavaScript 解题)
43 0
|
6天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
13 0
|
7月前
|
存储 C语言 C++
【C/C++刷题——leetcode】查找字符串中最大的子串
【C/C++刷题——leetcode】查找字符串中最大的子串
165 0
|
8月前
【力扣-TS解题】1、回文数
【力扣-TS解题】1、回文数
28 0
|
6天前
|
算法 测试技术 C#
【滑动窗口】【map】LeetCode:76最小覆盖子串
【滑动窗口】【map】LeetCode:76最小覆盖子串
|
6天前
|
算法 测试技术 C#
【滑动窗口】LeetCode:30串联所有单词的子串
【滑动窗口】LeetCode:30串联所有单词的子串
|
6天前
|
Java
2696. 删除子串后的字符串最小长度 --力扣 --JAVA
给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作,删除所有 "AB" 和 "CD" 子串,返回可获得的最终字符串的 最小 可能长度。 注意,删除子串后,重新连接出的字符串可能会产生新的 "AB" 或 "CD" 子串。
20 0
|
5月前
|
Java 测试技术
828. 统计子串中的唯一字符 --力扣 --JAVA
我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数。
39 2
|
6月前
|
JavaScript 前端开发
leetcode 1418.点菜展示表(JavaScript)
leetcode 1418.点菜展示表(JavaScript)
24 0