76.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package main
  2. func minWindow(s string, t string) string {
  3. m, n := len(s), len(t)
  4. if n == 0 {
  5. return ""
  6. }
  7. target, curr := make([]int, 256), make([]int, 256) // A little trick: byte < 256
  8. for i := 0; i < n; i++ {
  9. target[t[i]]++
  10. }
  11. cnt := 0
  12. left, right := -1, -1
  13. minLeft, minRight := -1, m-1
  14. for { // Create a slide window; all chars found, contract left; not enough, expand right.
  15. if cnt != n { // Expand right
  16. right++
  17. if right == m {
  18. break
  19. }
  20. if v := target[s[right]]; v > 0 {
  21. curr[s[right]]++
  22. if curr[s[right]] <= v {
  23. cnt++
  24. }
  25. }
  26. } else { // Contract left
  27. left++
  28. if v := target[s[left]]; v > 0 {
  29. curr[s[left]]--
  30. if curr[s[left]] < v {
  31. cnt--
  32. if right-left < minRight-minLeft {
  33. minLeft, minRight = left, right
  34. }
  35. }
  36. }
  37. }
  38. }
  39. if minLeft == -1 {
  40. return ""
  41. }
  42. return s[minLeft : minRight+1]
  43. }
  44. // func main() {
  45. // println(minWindow("ADOBECODEBANC", "ABC"))
  46. // println(minWindow("", "ABC"))
  47. // println(minWindow("ADOBECODEBANC", ""))
  48. // println(minWindow("ADOBECODEBANC", "CC"))
  49. // }