题解 | #最小覆盖子串#

最小覆盖子串

http://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

看注释理解

题目:https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

/**
  * 
  * @param S string字符串 
  * @param T string字符串 
  * @return string字符串
  */
function minWindow( S ,  T ) {
    // write code here
    const hash = new Map();
    for(let c of T)    hash.set(c, hash.get(c) + 1 || 1);	// 用于统计需要的字符数
    const targetLength = hash.size;
    const counts = new Map();	// 统计目前窗口中有效的字符数
    let l = 0;
    let res = '';
    let matchs = 0;
    for(let r = 0; r < S.length; r++) {
        if(hash.has(S[r])) {// 如果右指针指向元素是需要的
            counts.set(S[r], counts.get(S[r]) + 1 || 1);    // 在 counts 中增加数量
            if(counts.get(S[r]) === hash.get(S[r])) matchs++;    // 如果当前字符个数够了就增加匹配数
        }
        while(matchs === targetLength) {    // 满足匹配时不断增大左指针
            if(!res || res.length > (r - l + 1)) { // 保存结果
                res = S.slice(l, r + 1);
            }
            if(counts.has(S[l])) {    // 如果当前左指针指向元素在 counts 中
                counts.set(S[l], counts.get(S[l]) - 1);    // 发生计数元素删除操作
                if(counts.get(S[l]) < hash.get(S[l])) {  // 如果元素删除后导致元素个数'不够了',减少匹配数
                    // 判断的依据是‘不够了’,而不是不相同,因为有可能 counts 中数量有多的
                    matchs--;    // 如果当前字符个数不够了,减少匹配数
                }
            }
            l++;    // 增大左指针
        }
    }
    return res;
}
module.exports = {
    minWindow : minWindow
};    
全部评论
完全想不到啊啊啊啊啊啊
点赞 回复 分享
发布于 2023-08-21 15:20 湖南

相关推荐

不愿透露姓名的神秘牛友
昨天 18:05
点赞 评论 收藏
分享
程序员小白条:主要没亮点,项目也是网上的,平平无奇,那只能海投了,奖项总得有一些,然后就是现在最好是前后端都会,自己能做项目并且运维的,要么找星球项目改改,要么找个开源项目改改,自己能拓展功能才是主要的,跟做效率很低很低
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务