-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path76.minimum-window-substring.go
64 lines (58 loc) · 1.03 KB
/
76.minimum-window-substring.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package leetcode
/*
* @lc app=leetcode id=76 lang=golang
*
* [76] Minimum Window Substring
*/
// @lc code=start
func minWindow(s string, t string) string {
// init
// 1. init tMap
tMap := make(map[byte]int)
for i := 0; i < len(t); i++ {
tMap[t[i]]++
}
// 2. init sMap
sMap := make(map[byte]int)
// 3. init left, right, minLen, minLeft
left, right, minLen, minLeft := 0, 0, len(s)+1, 0
// 4. init valid
valid := 0
// loop
for right < len(s) {
// 1. add right
c := s[right]
right++
// 2. update sMap
if _, ok := tMap[c]; ok {
sMap[c]++
if sMap[c] == tMap[c] {
valid++
}
}
// 3. shrink left
for valid == len(tMap) {
// 3.1 update minLen, minLeft
if right-left < minLen {
minLen = right - left
minLeft = left
}
// 3.2 remove left
d := s[left]
left++
// 3.3 update sMap
if _, ok := tMap[d]; ok {
if sMap[d] == tMap[d] {
valid--
}
sMap[d]--
}
}
}
// return
if minLen == len(s)+1 {
return ""
}
return s[minLeft : minLeft+minLen]
}
// @lc code=end