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]
}