1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| use std::collections::HashMap;
pub fn min_window(s: String, t: String) -> String { let s = s.as_bytes(); let t = t.as_bytes(); let mut need = HashMap::new(); for &b in t { *need.entry(b).or_insert(0) += 1; } let mut window = HashMap::new(); let mut left = 0usize; let mut valid = 0; let mut min_len = usize::MAX; let mut start = 0;
for right in 0..s.len() { let c = s[right]; *window.entry(c).or_insert(0) += 1; if need.contains_key(&c) && window[&c] == need[&c] { valid += 1; }
while valid == need.len() { let cur_len = right - left + 1; if cur_len < min_len { min_len = cur_len; start = left; }
let d = s[left]; if need.contains_key(&d) && window[&d] == need[&d] { valid -= 1; } *window.get_mut(&d).unwrap() -= 1; left += 1; } }
if min_len == usize::MAX { "".to_string() } else { String::from_utf8(s[start..start + min_len].to_vec()).unwrap() } }
|