给你一个字符串 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]
}