diff --git a/0076_minimum-window-substring/README.md b/0076_minimum-window-substring/README.md new file mode 100644 index 0000000..beb591e --- /dev/null +++ b/0076_minimum-window-substring/README.md @@ -0,0 +1,38 @@ +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.length` +* `n == t.length` +* `1 <= m, n <= 105` +* `s` and `t` consist of uppercase and lowercase English letters. + +**Follow up:** Could you find an algorithm that runs in `O(m + n)` time? + +https://leetcode.com/problems/minimum-window-substring \ No newline at end of file diff --git a/0076_minimum-window-substring/python3/brute_force_tle.py b/0076_minimum-window-substring/python3/brute_force_tle.py new file mode 100644 index 0000000..d4b9acf --- /dev/null +++ b/0076_minimum-window-substring/python3/brute_force_tle.py @@ -0,0 +1,42 @@ +from collections import Counter + +class Solution: + def minWindow(self, s: str, t: str) -> str: + tcounts = Counter(t) + + # If chars of t is not included in the entire + # s string, then we can just return right away + if not tcounts <= Counter(s): + return "" + + tlen = len(t) + min_window = "" + + for start in range(len(s)): + end = start + tlen - 1 + + # We can all the substrings starting from `start` which is every + # letter of s + while end < len(s): + curr_window = s[start:end + 1] + curr_window_counts = Counter(curr_window) + + # <= is overloaded for Counters to mean inclusion + # + # i.e, counter_a -is-included-in- counter_b + # + if tcounts <= curr_window_counts: + # If no min_window has been computed yet or if current + # window is shorter, then we assign that as the new + # min_window + if min_window == "" or len(curr_window) < len(min_window): + min_window = curr_window + + # Since at this point, if we keep iterating in the inner loop, + # we'll only get longer substrings so we just break and proceed + # to find the substrings starting from the next letter (start + 1) + break + + end += 1 + + return min_window diff --git a/0076_minimum-window-substring/python3/solution.py b/0076_minimum-window-substring/python3/solution.py new file mode 100644 index 0000000..e69de29