编辑代码

package main
import "fmt"
func main () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
    fmt.Println("Hello JSRUN!   \n\n         - from Golang .")
}

func minWindow(s string, t string) string {
    // 如果主串 s 比目标串 t 短,则不符题意
    if len(s) < len(t) {
        return ""
    }
    // need 用于存储目标串 t 中每个字符的个数
    // window 用于存储当前窗口中可用于组成目标串 t 的字符个数
    need := make(map[byte]int)
    window := make(map[byte]int)
    // 录入目标串 t 各个不同字符的个数
    for i := range t {
        need[t[i]]++
    }

    // 窗口左边界、右边界
    left, right := 0, 0
    // 记录窗口中符合要求的不同字符的个数
    // window['a'] = 2, need['a'] = 3 ---> valid 不变
    // window['a'] = 3, need['a'] = 3 ---> valid += 1 
    valid := 0
    // 记录最小覆盖子串的起始索引及长度(结果串的起始点与长度)
    start := 0
    length := 0x11111111
    for right < len(s) {

        // c 将被移入窗口
        c := s[right]

        // 扩大窗口
        right++

        // 进行窗口内的数据更新
        if _, ok := need[c]; ok {   // 如果 c 在字符串 t 中
            window[c]++
            if window[c] == need[c] {   // 如果窗口内字符 c 的数量等于需要的数量
                valid++ // 符合要求的字符种类 + 1
            }
        }

        // 判断左侧窗口是否需要收缩
        for valid == len(need) {

            // 在这里更新最小字符串
            if right - left < length {
                start = left
                length = right - left
            }

            // d 将被移出窗口
            d := s[left]

            // 缩小窗口
            left++

            // 进行窗口内的数据更新
            if _, ok := need[d]; ok {
                if window[d] == need[d] {   // 如果窗口内字符 d 的数量等于需要的数量
                    valid-- // 符合要求的字符种类 - 1
                }
                window[d]--
            }
        }
    }
    // 如果没有找到最小字符串 返回空串
    if length == 0x11111111 {
        return ""
    }

    return s[start:start + length]
}