LeetCode——76.最小覆盖子串 滑动窗口

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:

如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring

题解

又是一道比较典型的滑动窗口的题,由于需要计算的是最小的子串,所以我们需要先找到一个子串,然后不断的缩小这个子串,并保证这个子串是合法的。

那么对于题目来时,并不要求是按照顺序的,所以我们先统计出T字符串中的字符的数量,然后在S字符串中从开始不断的寻找符合的子串,然后移动子串的左端,直到不符合条件,在此期间判断是否子串的长度及记录相应的状态。

func isTure(mpt, mps map[rune]int) bool {
    for key, value := range mpt {
        _ , ok := mps[key]
        if ok == false || mps[key] < value{
            return false 
        }
    }
    return true 
}
func minWindow(s string, t string) string {
    mp := make(map[rune]int,0)
    for _,value := range t {
        mp[value]+= 1
    }
    mps := make(map[rune]int,0)
    l :=0 
    length := len(s) + 1
    ansl := 0
    for index, value := range s {
        mps[value] += 1
        for l<=index && isTure(mp, mps) {
            if length > index -l +1 {
                length = index-l +1
                ansl = l
            }
            mps[rune(s[l])] -= 1
            l += 1

        }
    }
    //fmt.Println(ansl, length)
    if length > len(s) {
        return ""
    }
    return s[ansl:ansl+length]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章