문자열 S와 문자열 T 감안할 때, 복잡도 O (N)에서 T의 모든 문자를 포함 할 S의 최소 창을 찾을 수 있습니다.
예:
입력 : S = "ADOBECODEBANC"T = "ABC"
출력 "BANC"
참고
T의 모든 문자를 커버 S에서 그런 윈도우가없는 경우 빈 문자열 ""를 반환합니다.
같은 윈도우가있는 경우, 당신은 항상 S. 단지 하나의 고유 한 최소 윈도우가있을 것이라는 점을 보장
func minWindow(s string, t string) string {
if len(s) == 0 || len(t) == 0 {
return ""
}
goalMap := make(map[string]int)
for _, v := range t {
goalMap[string(v)]++
}
res, minLen := "", math.MaxInt32
l, cnt, golaSize := 0, 0, len(t)
currMap := make(map[string]int)
for r := 0; r < len(s); r++ {
key := string(s[r])
if goalMap[key] <= 0 {
continue
}
if currMap[key] < goalMap[key] {
cnt++
}
currMap[key]++
if cnt == golaSize {
k := string(s[l])
for goalMap[k] <= 0 || currMap[k] > goalMap[k] {
if goalMap[k] > 0 && currMap[k] > goalMap[k] {
currMap[k]--
}
l++
k = string(s[l])
}
if r-l+1 < minLen {
minLen = r - l + 1
res = s[l : r+1]
}
}
}
return res
}