Сложность: hard
Если в строках s1 и s2 нет такого окна, которое покрывало бы все символы в s2, верните пустую строку "". Если таких окон минимальной длины несколько, возвращается окно с самым левым начальным индексом.
Пример:
Input: s1 = "abcdebdde", s2 = "bde"
Output: "bcde"
👨💻 Алгоритм:
1⃣Используйте два указателя для определения текущего окна.
2⃣Поддерживайте счетчики для символов в текущем окне и требуемых символов из s2.
3⃣Перемещайте правый указатель, чтобы найти подходящее окно, и левый указатель, чтобы минимизировать его.
😎 Решение:
func minWindow(_ s1: String, _ s2: String) -> String {
if s1.isEmpty || s2.isEmpty {
return ""
}
var dictT = [Character: Int]()
for char in s2 {
dictT[char, default: 0] += 1
}
let required = dictT.count
var l = 0, r = 0, formed = 0
var windowCounts = [Character: Int]()
var ans = (length: Int.max, start: 0, end: 0)
let s1Array = Array(s1)
while r < s1Array.count {
let char = s1Array[r]
windowCounts[char, default: 0] += 1
if let count = dictT[char], windowCounts[char] == count {
formed += 1
}
while l <= r && formed == required {
let char = s1Array[l]
if r - l + 1 < ans.length {
ans = (r - l + 1, l, r)
}
windowCounts[char, default: 0] -= 1
if let count = dictT[char], windowCounts[char]! < count {
formed -= 1
}
l += 1
}
r += 1
}
return ans.length == Int.max ? "" : String(s1Array[ans.start...ans.end])
}Ставь 👍 и забирай 📚 Базу знаний