|
@@ -1,9 +1,51 @@
|
|
|
package main
|
|
|
|
|
|
func minWindow(s string, t string) string {
|
|
|
- return ""
|
|
|
+ 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() {
|
|
|
-
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// println(minWindow("ADOBECODEBANC", "ABC"))
|
|
|
+// println(minWindow("", "ABC"))
|
|
|
+// println(minWindow("ADOBECODEBANC", ""))
|
|
|
+// println(minWindow("ADOBECODEBANC", "CC"))
|
|
|
+// }
|