链接
题目.
难度:
high
解答:
窗口类的问题一般都是使用双指针,当条件不满足的时候扩大窗口,当条件满足的时候缩小窗口以获得最小窗口。还有个技巧是如何判断是否满足,这里用一个cnt来表示t字符串里有多少字符已经满足出现条件了。
package main
import "fmt"
func minWindow(s string, t string) string {
if len(t) == 0 || len(s) < len(t) {
return ""
}
tMap := make(map[byte]int)
for i := 0; i < len(t); i++ {
tMap[t[i]]++
}
start, end := 0, 0 //check s[start:end]
cnt := 0
result := ""
cur := make(map[byte]int)
for end = 1; end <= len(s); end++ {
c := s[end-1]
cur[c]++
if res, ok := tMap[c]; ok && res == cur[c] {
cnt++
if cnt == len(tMap) {
//successful
if result == "" || len(result) > (end-start) {
result = s[start:end]
}
//move forward left
for start < end {
c = s[start]
start++
cur[c]--
if res, ok := tMap[c]; ok && cur[c] < res {
cnt--
break
}
if len(result) > (end - start) {
result = s[start:end]
}
}
}
}
}
return result
}
func main() {
fmt.Println(minWindow("ADOBECODEBANC", "ABC"))
}
复杂度分析
time
O(n)
space
O(1)
执行结果
执行用时 :
24 ms
, 在所有 golang 提交中击败了
55.61%
的用户
内存消耗 :
2.9 MB
, 在所有 golang 提交中击败了
60.00%
的用户