123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package main
- func minWindow(s string, t string) string {
- m, n := len(s), len(t)
- if n == 0 {
- return ""
- }
- target, curr := make([]int, 256), make([]int, 256) // A little trick: byte < 256
- for i := 0; i < n; i++ {
- target[t[i]]++
- }
- cnt := 0
- left, right := -1, -1
- minLeft, minRight := -1, m-1
- for { // Create a slide window; all chars found, contract left; not enough, expand right.
- if cnt != n { // Expand right
- right++
- if right == m {
- break
- }
- if v := target[s[right]]; v > 0 {
- curr[s[right]]++
- if curr[s[right]] <= v {
- cnt++
- }
- }
- } else { // Contract left
- left++
- if v := target[s[left]]; v > 0 {
- curr[s[left]]--
- if curr[s[left]] < v {
- cnt--
- if right-left < minRight-minLeft {
- minLeft, minRight = left, right
- }
- }
- }
- }
- }
- if minLeft == -1 {
- return ""
- }
- return s[minLeft : minRight+1]
- }
- // func main() {
- // println(minWindow("ADOBECODEBANC", "ABC"))
- // println(minWindow("", "ABC"))
- // println(minWindow("ADOBECODEBANC", ""))
- // println(minWindow("ADOBECODEBANC", "CC"))
- // }
|