Hard
Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there is no such substring__, return the empty string "".
The testcases will be generated such that the answer is unique.
A substring is a contiguous sequence of characters within the string.
Example 1:
Input: s = “ADOBECODEBANC”, t = “ABC”
Output: “BANC”
Explanation: The minimum window substring “BANC” includes ‘A’, ‘B’, and ‘C’ from string t.
Example 2:
Input: s = “a”, t = “a”
Output: “a”
Explanation: The entire string s is the minimum window.
Example 3:
Input: s = “a”, t = “aa”
Output: “”
Explanation: Both ‘a’s from t must be included in the window. Since the largest window of s only has one ‘a’, return empty string.
Constraints:
m == s.lengthn == t.length1 <= m, n <= 105s and t consist of uppercase and lowercase English letters.Follow up: Could you find an algorithm that runs in O(m + n) time?
To solve this task using Python with a Solution class, you can follow these steps:
Solution.minWindow that takes s and t as input parameters.s that contains all characters of t.t_count to store the frequency of characters in string t.left and right to keep track of the window boundaries.min_window_start and min_window_length to store the starting index and length of the minimum window substring found so far.s using the right pointer (right), and update the character frequencies in a temporary dictionary window_count.t are found in the current window, update min_window_start and min_window_length if the current window is smaller than the minimum window found so far.left) to shrink the window until the window no longer contains all characters of t.s.Here’s the implementation:
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        t_count = {}
        for char in t:
            t_count[char] = t_count.get(char, 0) + 1
        
        left, right = 0, 0
        min_window_start = 0
        min_window_length = float('inf')
        required_chars = len(t)
        
        while right < len(s):
            if s[right] in t_count:
                if t_count[s[right]] > 0:
                    required_chars -= 1
                t_count[s[right]] -= 1
            
            while required_chars == 0:
                if right - left + 1 < min_window_length:
                    min_window_length = right - left + 1
                    min_window_start = left
                
                if s[left] in t_count:
                    t_count[s[left]] += 1
                    if t_count[s[left]] > 0:
                        required_chars += 1
                left += 1
            
            right += 1
        
        return s[min_window_start:min_window_start + min_window_length] if min_window_length != float('inf') else ""
This solution uses a sliding window approach to efficiently search for the minimum window substring. It iterates through the string s only once, so the time complexity is O(m + n), where m is the length of s and n is the length of t.
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        from collections import Counter
        map = [0] * 128
        for char in t:
            map[ord(char) - ord('A')] += 1
        count = len(t)
        begin = 0
        end = 0
        d = float('inf')
        head = 0
        while end < len(s):
            if map[ord(s[end]) - ord('A')] > 0:
                count -= 1
            map[ord(s[end]) - ord('A')] -= 1
            end += 1
            while count == 0:
                if end - begin < d:
                    d = end - begin
                    head = begin
                map[ord(s[begin]) - ord('A')] += 1
                if map[ord(s[begin]) - ord('A')] > 0:
                    count += 1
                begin += 1
        return "" if d == float('inf') else s[head:head + d]