📖 Scenario: You are working on a text processing tool that extracts the smallest part of a document containing all keywords. This helps users quickly find relevant sections without reading the entire text.
🎯 Goal: Build a Java program that finds the minimum window substring in a given string s which contains all characters of another string t.
📋 What You'll Learn
Create a string variable s with the value "ADOBECODEBANC".
Create a string variable t with the value "ABC".
Create a helper integer variable required to store the number of unique characters in t.
Use two hash maps: Map windowCounts and Map dictT to count characters.
Use two pointers left and right to represent the sliding window boundaries.
Implement the sliding window technique to find the minimum substring in s containing all characters of t.
Print the minimum window substring found.
💡 Why This Matters
🌍 Real World
Finding the shortest snippet in a document that contains all search keywords helps users quickly locate relevant information.
💼 Career
This technique is useful in search engines, text editors, and data processing roles where efficient substring search is required.
Progress0 / 4 steps
1
Create input strings s and t
Create a string variable s with the value "ADOBECODEBANC" and a string variable t with the value "ABC".
DSA Java
Hint
Use String s = "ADOBECODEBANC"; and String t = "ABC"; to create the input strings.
2
Create dictT map and required count
Create a Map<Character, Integer> dictT to count characters in t. Then create an integer variable required to store the number of unique characters in t.
DSA Java
Hint
Use a HashMap to count characters in t. Use dictT.size() to get the number of unique characters.
3
Implement sliding window to find minimum substring
Create two pointers left and right initialized to 0. Create a Map<Character, Integer> windowCounts to count characters in the current window. Use a variable formed to track how many unique characters meet the required count. Use a loop to move right pointer over s and update counts. When formed equals required, try to contract the window by moving left pointer. Keep track of the smallest window found using variables ans as an array of three integers: window length, left index, right index.
DSA Java
Hint
Use two pointers and a map to count characters in the current window. Expand right pointer and update counts. When all required characters are matched, move left pointer to find smaller windows.
4
Print the minimum window substring
Print the substring of s from index ans[1] to ans[2] inclusive if ans[0] is not -1. Otherwise, print an empty string.
DSA Java
Hint
Use System.out.println(s.substring(ans[1], ans[2] + 1)); to print the minimum window substring if found, otherwise print an empty string.
Practice
(1/5)
1. What is the main goal of the Minimum Window Substring problem?
easy
A. Find the smallest substring in a string that contains all characters of another string
B. Find the longest substring without repeating characters
C. Count the number of substrings that contain a specific character
D. Sort the characters of a string in ascending order
Solution
Step 1: Understand the problem statement
The problem asks to find the smallest part of a string that includes all characters from another string.
Step 2: Compare options with the problem goal
Only Find the smallest substring in a string that contains all characters of another string matches the goal of finding the smallest substring containing all characters of another string.
Final Answer:
Find the smallest substring in a string that contains all characters of another string -> Option A
Quick Check:
Minimum window substring = smallest substring containing all chars [OK]
Hint: Look for smallest substring covering all target chars [OK]
Common Mistakes:
Confusing with longest substring problems
Thinking about sorting instead of substring search
Ignoring the requirement to include all characters
2. Which Java data structure is most suitable to keep track of character counts when solving the Minimum Window Substring problem?
easy
A. ArrayList<Character>
B. LinkedList<Character>
C. HashMap
D. Stack<Character>
Solution
Step 1: Identify the need for character frequency tracking
We need to count how many times each character appears in the target string and current window.
Step 2: Choose a data structure that maps characters to counts
HashMap allows storing character keys with their counts efficiently.
Final Answer:
HashMap -> Option C
Quick Check:
Use HashMap for char count tracking [OK]
Hint: Use HashMap to map chars to counts quickly [OK]
Common Mistakes:
Using ArrayList which doesn't map keys to counts
Using Stack or LinkedList which don't store counts
Trying to use arrays without knowing character range
3. What will be the output of the following Java code snippet?
String s = "ADOBECODEBANC";
String t = "ABC";
// Assume minWindow(s, t) returns the minimum window substring
System.out.println(minWindow(s, t));
Given that minWindow is correctly implemented for the Minimum Window Substring problem.
medium
A. "BANC"
B. "ADOBEC"
C. "CODEBA"
D. "DOBECODEBA"
Solution
Step 1: Understand the input strings
String s is "ADOBECODEBANC" and t is "ABC". We want the smallest substring of s containing A, B, and C.
Step 2: Identify the minimum window substring
The substring "BANC" is the shortest substring containing all characters A, B, and C.
Final Answer:
"BANC" -> Option A
Quick Check:
Minimum window substring for "ABC" in s = "BANC" [OK]
Hint: Remember classic example: "BANC" is minimum window for "ABC" [OK]
Common Mistakes:
Choosing longer substrings that contain all chars
Confusing order of characters in substring
Assuming first occurrence is minimum window
4. Consider this buggy Java code snippet for Minimum Window Substring:
public String minWindow(String s, String t) {
Map map = new HashMap<>();
for (char c : t.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
int left = 0, right = 0, count = t.length();
int minLen = Integer.MAX_VALUE, start = 0;
while (right < s.length()) {
char c = s.charAt(right);
if (map.containsKey(c)) {
map.put(c, map.get(c) - 1);
if (map.get(c) >= 0) count--;
}
while (count == 0) {
if (right - left + 1 < minLen) {
minLen = right - left + 1;
start = left;
}
char leftChar = s.charAt(left);
if (map.containsKey(leftChar)) {
map.put(leftChar, map.get(leftChar) + 1);
if (map.get(leftChar) > 0) count++;
}
left++;
}
right++;
}
return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
}
What is the main bug in this code?
medium
A. The map is not updated correctly when shrinking the window
B. The substring returned uses wrong indices
C. The while loop condition should be count > 0 instead of count == 0
D. The count variable is initialized incorrectly
Solution
Step 1: Analyze the substring return statement
The substring is returned using s.substring(start, start + minLen). In Java, substring's end index is exclusive, so this is correct.
Step 2: Check map and count updates
The map and count updates when expanding and shrinking the window are correct.
Step 3: Check loop conditions and initialization
Count initialization and while loop conditions are correct.
Step 4: Identify the actual bug
The main bug is that the code does not handle the case when the minimum window substring is not found, returning an empty string is correct, so no bug there. The code is logically correct.
Step 5: Re-examine options
Options A, B, and C are incorrect. The substring returned uses wrong indices is also not a bug. Therefore, no bug exists in the code.
Step 6: Final Answer
No bug found in the code snippet
Hint: Check carefully map and count updates and substring indices [OK]
Common Mistakes:
Confusing loop conditions for count
Incorrect substring indices
Ignoring map updates when shrinking window
5. You want to find the minimum window substring of s = "aabbccdd" that contains all characters of t = "abc". Which of the following substrings is the correct minimum window substring?
hard
A. "abbc"
B. "bcca"
C. "abc"
D. "aabbcc"
Solution
Step 1: Identify all substrings containing 'a', 'b', and 'c'
Check substrings of s that include at least one 'a', one 'b', and one 'c'.
Step 2: Find the smallest such substring
"aabbcc" (positions 0 to 5) contains 'a', 'b', 'c' and is the smallest continuous substring containing all characters. "abbc" is not a continuous substring in s. "abc" does not appear as a continuous substring. "bcca" is not a substring in order.
Final Answer:
"aabbcc" -> Option D
Quick Check:
Minimum window substring = "aabbcc" [OK]
Hint: Check all substrings, pick shortest with all chars [OK]
Common Mistakes:
Assuming "abc" must appear in order
Choosing shorter substrings that are not continuous
Ignoring repeated characters in s
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.