Title Link: https://leetcode-cn.com/problems/minimum-window-substring/
Title Description:
Give you a string S and a string t, please find out in the string S: the smallest string containing all the letters of T.
Example:
Input: S = adobecodebanc, t = ABC Output: "BANC"
Train of thought:
sliding window
We only need to ensure that the number of characters in the window (queue) string containing t is greater than or equal to the number of corresponding elements in t. for example, method 1
There is also a way to record the differences between queue elements and elements in t. look at the code directly, it's easy to understand!
Code:
lass Solution: def minWindow(self, s: 'str', t: 'str') -> 'str': from collections import Counter t = Counter(t) lookup = Counter() start = 0 end = 0 min_len = float("inf") res = "" while end < len(s): lookup[s[end]] += 1 end += 1 #print(start, end) while all(map(lambda x: lookup[x] >= t[x], t.keys())): if end - start < min_len: res = s[start:end] min_len = end - start lookup[s[start]] -= 1 start += 1 return res
Another way
python
class Solution: def minWindow(self, s: 'str', t: 'str') -> 'str': from collections import defaultdict lookup = defaultdict(int) for c in t: lookup[c] += 1 start = 0 end = 0 min_len = float("inf") counter = len(t) res = "" while end < len(s): if lookup[s[end]] > 0: counter -= 1 lookup[s[end]] -= 1 end += 1 while counter == 0: if min_len > end - start: min_len = end - start res = s[start:end] if lookup[s[start]] == 0: counter += 1 lookup[s[start]] += 1 start += 1 return res
java
class Solution { public String minWindow(String s, String t) { Map<Character, Integer> lookup = new HashMap<>(); for (char c : s.toCharArray()) lookup.put(c, 0); for (char c : t.toCharArray()) { if (lookup.containsKey(c)) lookup.put(c, lookup.get(c) + 1); else return ""; } int start = 0; int end = 0; int min_len = Integer.MAX_VALUE; int counter = t.length(); String res = ""; while (end < s.length()) { char c1 = s.charAt(end); if (lookup.get(c1) > 0) counter--; lookup.put(c1, lookup.get(c1) - 1); end++; while (counter == 0) { if (min_len > end - start) { min_len = end - start; res = s.substring(start, end); } char c2 = s.charAt(start); if (lookup.get(c2) == 0) counter++; lookup.put(c2, lookup.get(c2) + 1); start++; } } return res; } }
The following describes the universal template of sliding window, which can solve related problems. I believe that I can have a certain understanding of sliding window!
There are also similar topics:
3. Longest substring without repeating characters
class Solution: def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ from collections import defaultdict lookup = defaultdict(int) start = 0 end = 0 max_len = 0 counter = 0 while end < len(s): if lookup[s[end]] > 0: counter += 1 lookup[s[end]] += 1 end += 1 while counter > 0: if lookup[s[start]] > 1: counter -= 1 lookup[s[start]] -= 1 start += 1 max_len = max(max_len, end - start) return max_len
class Solution: def minWindow(self, s: 'str', t: 'str') -> 'str': from collections import defaultdict lookup = defaultdict(int) for c in t: lookup[c] += 1 start = 0 end = 0 min_len = float("inf") counter = len(t) res = "" while end < len(s): if lookup[s[end]] > 0: counter -= 1 lookup[s[end]] -= 1 end += 1 while counter == 0: if min_len > end - start: min_len = end - start res = s[start:end] if lookup[s[start]] == 0: counter += 1 lookup[s[start]] += 1 start += 1 return res
159. Longest substring containing at most two different characters
class Solution: def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int: from collections import defaultdict lookup = defaultdict(int) start = 0 end = 0 max_len = 0 counter = 0 while end < len(s): if lookup[s[end]] == 0: counter += 1 lookup[s[end]] += 1 end +=1 while counter > 2: if lookup[s[start]] == 1: counter -= 1 lookup[s[start]] -= 1 start += 1 max_len = max(max_len, end - start) return max_len
340. Longest substring with up to K different characters
class Solution: def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int: from collections import defaultdict lookup = defaultdict(int) start = 0 end = 0 max_len = 0 counter = 0 while end < len(s): if lookup[s[end]] == 0: counter += 1 lookup[s[end]] += 1 end += 1 while counter > k: if lookup[s[start]] == 1: counter -= 1 lookup[s[start]] -= 1 start += 1 max_len = max(max_len, end - start) return max_len
Slide window title:
3. Longest substring without repeating characters
30. Concatenate all word substrings
159. Longest substring containing at most two different characters