func minWindow(s string, t string) string {
var solution func(s, t string) string // 解决方案
solution = func(s, t string) string {
var window = map[string]int{} // 滑动窗口
var need = map[string]int{} // 目标态
var valid, left, right, start int
var step = math.MaxInt // 初始化最大步长
for _, v := range t {
need[string(v)]++ // 初始化目标态
}
length := len(s)
for right < length { // 开始求解
c := string(s[right]) // 取出要判断的字符
right++ // 右移窗口
if _, ok := need[c]; ok { // 命中目标态
window[c]++ // 放入窗口
if window[c] == need[c] {
valid++ // 该字符已达到目标态
}
}
for valid == len(need) { // 全部完成目标态
if right-left < step { // 缩小窗口
start = left // 最终返回字符的左边界
step = right - left // 窗口大小
}
d := string(s[left])
left++ // 缩小窗口
if _, ok := need[d]; ok {
if window[d] == need[d] {
valid-- // 不满足目标态了
}
window[d]-- // 从窗口中减去数据
}
}
}
if step < math.MaxInt { //找到结果
return s[start : start+step] // Golang语言特性 [左区间, 左区间+步长]
}
return "" // 未找到
}
return solution(s, t)
}
评论