給你一個字符串 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]
}