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)}
评论