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.
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 <= 105sandtconsist of uppercase and lowercase English letters.
Approach 01:
-
C++
-
Python
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> freq_t;
int m = s.length();
int n = t.length();
if (n > m) {
return "";
}
for(auto &ch: t){
freq_t[ch]++;
}
int i = 0, j = 0;
int required_cnt = n;
int min_window_size = INT_MAX;
int start_i = 0;
while (j < m) {
char ch = s[j];
if (freq_t[ch] > 0) {
required_cnt--;
}
freq_t[ch]--;
while (required_cnt == 0) {
int curr_window_size = j - i + 1;
if (curr_window_size < min_window_size) {
min_window_size = curr_window_size;
start_i = i;
}
freq_t[s[i]]++;
if (freq_t[s[i]] > 0) {
required_cnt++;
}
i++;
}
j++;
}
if (min_window_size == INT_MAX) {
return "";
}
return s.substr(start_i, min_window_size);
}
};
from typing import *
import collections
import sys
class Solution:
def minWindow(self, s: str, t: str) -> str:
freq_t = collections.Counter(t)
m = len(s)
n = len(t)
if(n>m):
return ''
i, j = 0, 0
required_cnt = n
min_window_size = sys.maxsize
start_i = 0
while(j<m):
ch = s[j]
if(freq_t[ch] > 0):
required_cnt -= 1
freq_t[ch] -= 1
while(required_cnt == 0):
curr_window_size = j-i+1
if(curr_window_size < min_window_size):
min_window_size = curr_window_size
start_i = i
freq_t[s[i]] += 1
if(freq_t[s[i]] > 0):
required_cnt += 1
i += 1
j += 1
if(min_window_size == sys.maxsize):
return ''
return s[start_i: start_i + min_window_size]
Time Complexity
- The time complexity of the
minWindowfunction is \( O(m + n) \), where \( m \) is the length of the stringsand \( n \) is the length of the stringt. - Building the frequency map
freq_tfor stringttakes \( O(n) \) time. - The two-pointer technique to find the minimum window involves iterating through the string
susing two pointersiandj, which takes \( O(m) \) time in total. - Thus, the overall time complexity is \( O(m) + O(n) = O(m + n) \).
Space Complexity
- The space complexity of the
minWindowfunction is \( O(k) \), where \( k \) is the number of unique characters in the stringt. - The frequency map
freq_tstores the count of each character int, and the size of this map is proportional to the number of unique characters int. Therefore, the space complexity for the map is \( O(k) \). - Additional space is used for a few integer variables, which does not depend on the input size, hence considered as \( O(1) \).
- Thus, the overall space complexity is \( O(k) \).