def min_window(search_str: str, target_letters: str) -> str: """ Given a string to search, and another string of target char_dict, return the smallest substring of the search string that contains all target char_dict. >>> is_contains_unique_chars("Hello World", "lWl") "llo W" >>> is_contains_unique_chars("Hello World", "f") "" This solution uses a sliding window, alternating between shifting the end of the window right until all target char_dict are contained in the window, and shifting the start of the window right until the window no longer contains every target character. Time complexity: O(target_count + search_len) -> The algorithm checks a dictionary at most twice for each character in search_str. Space complexity: O(search_len) -> The primary contributer to additional space is the building of a dictionary using the search string. """ target_count = len(target_letters) search_len = len(search_str) # Return if not possible due to string lengths. if search_len < target_count: return "" # Build dictionary with counts for each letter in target_letters char_dict = {} for ch in target_letters: if ch not in char_dict: char_dict[ch] = 1 else: char_dict[ch] += 1 # Initialize window window_start = 0 window_end = 0 exists = False min_window_len = search_len + 1 # Start sliding window algorithm while window_end < search_len: # Slide window end right until all search characters are contained while target_count > 0 and window_end < search_len: cur = search_str[window_end] if cur in char_dict: char_dict[cur] -= 1 if char_dict[cur] >= 0: target_count -= 1 window_end += 1 temp = window_end - window_start # Check if window is the smallest found so far if target_count == 0 and temp < min_window_len: min_window = [window_start, window_end] exists = True min_window_len = temp # Slide window start right until a search character exits the window while target_count == 0 and window_start < window_end: cur = search_str[window_start] window_start += 1 if cur in char_dict: char_dict[cur] += 1 if char_dict[cur] > 0: break temp = window_end - window_start + 1 # Check if window is the smallest found so far if temp < min_window_len and target_count == 0: min_window = [window_start - 1, window_end] min_window_len = temp target_count = 1 if exists: return search_str[min_window[0] : min_window[1]] else: return ""