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]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章