DEV Community

Cover image for LeetCode Challenge: 76. Minimum Window Substring - JavaScript Solution πŸš€
Rahul Kumar Barnwal
Rahul Kumar Barnwal

Posted on

2 1 1 1 1

LeetCode Challenge: 76. Minimum Window Substring - JavaScript Solution πŸš€

Top Interview 150

The Minimum Window Substring problem requires finding the smallest substring of s that contains all characters from t. Let’s solve it step by step using an efficient sliding window approach.


πŸš€ Problem Description

Given strings s and t, return the smallest substring of s such that all characters in t (including duplicates) are included in the substring. If no such substring exists, return an empty string "".


πŸ’‘ Examples

Example 1

Input: s = "ADOBECODEBANC", t = "ABC"  
Output: "BANC"  
Explanation: The substring "BANC" contains all characters 'A', 'B', and 'C'.
Enter fullscreen mode Exit fullscreen mode

Example 2

Input: s = "a", t = "a"  
Output: "a"  
Explanation: The entire string `s` matches `t`.
Enter fullscreen mode Exit fullscreen mode

Example 3

Input: s = "a", t = "aa"  
Output: ""  
Explanation: `t` requires two 'a's, but `s` only has one.
Enter fullscreen mode Exit fullscreen mode

πŸ† JavaScript Solution

We will solve this using a sliding window and hash maps to keep track of character frequencies.


Implementation

var minWindow = function(s, t) {
    if (s.length < t.length) return "";

    const tFrequency = {};
    for (let char of t) {
        tFrequency[char] = (tFrequency[char] || 0) + 1;
    }

    let left = 0;
    let right = 0;
    let formed = 0;
    const windowFrequency = {};
    let minLength = Infinity;
    let minWindow = "";

    const required = Object.keys(tFrequency).length;

    while (right < s.length) {
        const char = s[right];
        windowFrequency[char] = (windowFrequency[char] || 0) + 1;

        if (tFrequency[char] && windowFrequency[char] === tFrequency[char]) {
            formed++;
        }

        while (formed === required) {
            if (right - left + 1 < minLength) {
                minLength = right - left + 1;
                minWindow = s.substring(left, right + 1);
            }

            const leftChar = s[left];
            windowFrequency[leftChar]--;
            if (tFrequency[leftChar] && windowFrequency[leftChar] < tFrequency[leftChar]) {
                formed--;
            }
            left++;
        }

        right++;
    }

    return minWindow;
};
Enter fullscreen mode Exit fullscreen mode

πŸ” How It Works

  1. Frequency Map for t:

    • Create a hash map tFrequency to store the count of each character in t.
  2. Sliding Window:

    • Use two pointers (left and right) to define a dynamic window in s.
    • Expand the window by moving right.
    • Contract the window by moving left when all characters in t are present.
  3. Update Minimum Window:

    • When the window contains all characters in t (i.e., formed === required), check if it’s the smallest window so far.

4.Return Result:

  • Return the smallest substring stored in minWindow.

πŸ”‘ Complexity Analysis

  • Time Complexity: O(m+n), where m is the length of s and n is the length of t.

    • Each character in s is processed at most twice (once by right and once by left).
  • Space Complexity: O(n+m), where n is the size of tFrequency and m is the size of windowFrequency.


πŸ“‹ Dry Run

Input: s = "ADOBECODEBANC", t = "ABC"

Dry Run
Output: "BANC"


✨ Pro Tips for Interviews

  1. Explain Sliding Window:

    • Highlight its efficiency in reducing unnecessary computations by dynamically adjusting the window size.
  2. Discuss Edge Cases:

    • s shorter than t.
    • Characters in t not in s.
    • Multiple valid substrings with the same minimum length.
  3. Highlight Efficiency:

    • Compare this O(m+n) solution with naive O(mβ‹…n) approaches that check all substrings.

πŸ“š Learn More

Check out the full explanation and code walkthrough on my previous Dev.to post:
πŸ‘‰ Substring with Concatenation of All Words - JavaScript Solution

What’s your approach to solving this problem? Let’s discuss! πŸš€


Study

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (1)

Collapse
 
rahulgithubweb profile image
Rahul Kumar Barnwal β€’

Follow Me on GitHub πŸš€

If you found this solution helpful, check out more of my projects and solutions on my GitHub profile.

Don't forget to follow for more updates!

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free β†’