Problem Summary
You’re given a string s made up of only '0', '1', and '2'.
Your task:
Find the length of the smallest substring that contains all three characters at least once.
If it’s not possible, return -1.
Key Insight
Instead of checking all substrings (which is slow), we use the Sliding Window technique.
Why Sliding Window?
Because:
We need a continuous substring
We want the smallest valid window
We can expand and shrink dynamically
Concept Explained
Think of a window (substring) defined by two pointers:
[left .... right]
Step 1: Expand Window
Move right forward and include characters.
Step 2: Check Validity
If the window contains:
at least one '0'
at least one '1'
at least one '2'
Then it's valid.
Step 3: Shrink Window
Move left forward to minimize the window while keeping it valid.
Example Walkthrough
Input:
s = "10212"
Step-by-step:
Step: 1
Window: "1"
Contains 0,1,2?: NO
Action: Expand
Length: -Step: 2
Window: "10"
Contains 0,1,2?: NO
Action: Expand
Length: -Step: 3
Window: "102"
Contains 0,1,2?: YES
Action: Update min
Length: 3Step: 4
Window: "021"
Contains 0,1,2?: YES
Action: Shrink
Length: 3Step: 5
Window: "212"
Contains 0,1,2?: NO
Action: Expand
Length: -
Output:
3
Another Example
Input:
s = "12121"
There is no '0' in the string.
Output:
-1
Algorithm
Use an array count[3] to track frequency of '0', '1', '2'
Use two pointers: left and right
Expand right:
Add character to count
If all 3 characters are present:
Update minimum length
Move left to shrink window
Repeat until end
Code (Java)
class Solution {
public int smallestSubstring(String s) {
int n = s.length();
int[] count = new int[3];
int left = 0, minLen = Integer.MAX_VALUE;
int unique = 0;
for (int right = 0; right < n; right++) {
int idx = s.charAt(right) - '0';
if (count[idx] == 0) unique++;
count[idx]++;
while (unique == 3) {
minLen = Math.min(minLen, right - left + 1);
int leftIdx = s.charAt(left) - '0';
count[leftIdx]--;
if (count[leftIdx] == 0) unique--;
left++;
}
}
return minLen == Integer.MAX_VALUE ? -1 : minLen;
}
}
Complexity
Time Complexity: O(n)
Each character is processed at most twice
Space Complexity: O(1)
Only 3 counters used
Key Takeaways
This is a classic sliding window problem
Always:
Expand → until valid
Shrink → to minimize
Works for many problems like:
Smallest substring with all characters
Longest substring with constraints
Summary
This article explains how to find the smallest substring containing all characters '0', '1', and '2' using a sliding window approach, where the window dynamically expands and shrinks to maintain validity and achieve optimal performance in linear time with constant space.

Join the conversation! Your thoughts help the community grow.