60 lines
997 B
Go
60 lines
997 B
Go
package top100liked
|
|
|
|
import "testing"
|
|
|
|
// https://leetcode.cn/problems/minimum-window-substring/?envType=study-plan-v2&envId=top-100-liked
|
|
|
|
func minWindow(s string, t string) string {
|
|
if len(t) > len(s) {
|
|
return ""
|
|
}
|
|
need := make(map[byte]int)
|
|
for _, v := range []byte(t) {
|
|
need[v]++
|
|
}
|
|
|
|
window := make(map[byte]int)
|
|
valid := 0
|
|
left := 0
|
|
minLen := len(s) + 1
|
|
start := 0
|
|
|
|
for right := 0; right < len(s); right++ {
|
|
ch := s[right]
|
|
if _, ok := need[ch]; ok {
|
|
window[ch]++
|
|
if window[ch] == need[ch] {
|
|
valid++
|
|
}
|
|
}
|
|
|
|
for valid == len(need) {
|
|
if right-left+1 < minLen {
|
|
minLen = right - left + 1
|
|
start = left
|
|
}
|
|
|
|
d := s[left]
|
|
left++
|
|
if _, ok := need[d]; ok {
|
|
if window[d] == need[d] {
|
|
valid--
|
|
}
|
|
window[d]--
|
|
}
|
|
}
|
|
}
|
|
|
|
if minLen == len(s)+1 {
|
|
return ""
|
|
}
|
|
|
|
return s[start : start+minLen]
|
|
}
|
|
|
|
func TestS12(t *testing.T) {
|
|
println(minWindow("ADOBECODEBANC", "ABC"))
|
|
println(minWindow("a", "a"))
|
|
println(minWindow("a", "aa"))
|
|
}
|