76 最小覆盖子串-困难

题目:

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

分析:

详见 readme

// date 2023/11/28
func minWindow(s string, t string) string {
    tset := make(map[byte]int, 32)
    for i := 0; i < len(t); i++ {
        tset[t[i]]++
    }
    scnt := make(map[byte]int, 32)
    isContainT := func() bool {
        for k, v := range tset {
            if scnt[k] < v {
                return false
            }
        }
        return true
    }
    ans := -1
    al, ar := 0, 0
    left, right := 0, 0
    n := len(s)
    for right < n {
        scnt[s[right]]++
        right++

        for isContainT() {
            if ans == -1 {
                ans = right - left
                al, ar = left, right
            } else if right - left < ans {
                ans = right - left
                al, ar = left, right
            }
            scnt[s[left]]--
            if scnt[s[left]] == 0 {
                delete(scnt, s[left])
            }
            left++
        }
    }
    if ans == -1 {
        return ""
    }
    return string(s[al:ar])
}

最后更新于