Quiz on Sliding window Technique for DSA: Question 6

Last Updated :
Discuss
Comments

For the given code:

C++
int longestSubstringWithKDistinct(string str, int k) {
    int windowStart = 0, maxLength = 0;
    unordered_map<char, int> freqMap;
    
    for (int windowEnd = 0; windowEnd < str.length(); windowEnd++) {
        freqMap[str[windowEnd]]++;
        
        while (freqMap.size() > k) {
            freqMap[str[windowStart]]--;
            if (freqMap[str[windowStart]] == 0) {
                freqMap.erase(str[windowStart]);
            }
            windowStart++;
        }
        
        maxLength = max(maxLength, windowEnd - windowStart + 1);
    }
    
    return maxLength;
}
C
#define MAX_CHAR 256

int longestSubstringWithKDistinct(char *str, int k) {
    int windowStart = 0, maxLength = 0;
    int freqMap[MAX_CHAR] = {0};
    int distinctCount = 0;
    
    for (int windowEnd = 0; str[windowEnd] != '\0'; windowEnd++) {
        // Add the current character to the frequency map
        if (freqMap[str[windowEnd]] == 0) {
            distinctCount++;
        }
        freqMap[str[windowEnd]]++;
        
        // Shrink the window if we have more than 'k' distinct characters
        while (distinctCount > k) {
            freqMap[str[windowStart]]--;
            if (freqMap[str[windowStart]] == 0) {
                distinctCount--;
            }
            windowStart++;
        }
        
        // Update maxLength if the current window size is greater
        maxLength = (maxLength > windowEnd - windowStart + 1) ? maxLength : windowEnd - windowStart + 1;
    }
    
    return maxLength;
}
Java
public class LongestSubstring {
    public static int longestSubstringWithKDistinct(String str, int k) {
        int windowStart = 0;
        int maxLength = 0;
        HashMap<Character, Integer> freqMap = new HashMap<>();
        
        for (int windowEnd = 0; windowEnd < str.length(); windowEnd++) {
            freqMap.put(str.charAt(windowEnd), freqMap.getOrDefault(str.charAt(windowEnd), 0) + 1);
            
            while (freqMap.size() > k) {
                freqMap.put(str.charAt(windowStart), freqMap.get(str.charAt(windowStart)) - 1);
                if (freqMap.get(str.charAt(windowStart)) == 0) {
                    freqMap.remove(str.charAt(windowStart));
                }
                windowStart++;
            }
            
            maxLength = Math.max(maxLength, windowEnd - windowStart + 1);
        }
        
        return maxLength;
    }
}
Python
def longestSubstringWithKDistinct(str, k):
    window_start = 0
    max_length = 0
    freq_map = {}
    
    for window_end in range(len(str)):
        freq_map[str[window_end]] = freq_map.get(str[window_end], 0) + 1
        
        while len(freq_map) > k:
            freq_map[str[window_start]] -= 1
            if freq_map[str[window_start]] == 0:
                del freq_map[str[window_start]]
            window_start += 1
        
        max_length = max(max_length, window_end - window_start + 1)
    
    return max_length
JavaScript
function longestSubstringWithKDistinct(str, k) {
    let windowStart = 0;
    let maxLength = 0;
    const freqMap = new Map();
    
    for (let windowEnd = 0; windowEnd < str.length; windowEnd++) {
        freqMap.set(str[windowEnd], (freqMap.get(str[windowEnd]) || 0) + 1);
        
        while (freqMap.size > k) {
            freqMap.set(str[windowStart], freqMap.get(str[windowStart]) - 1);
            if (freqMap.get(str[windowStart]) === 0) {
                freqMap.delete(str[windowStart]);
            }
            windowStart++;
        }
        
        maxLength = Math.max(maxLength, windowEnd - windowStart + 1);
    }
    
    return maxLength;
}

What is the output of the above code when str= "eceabcaabbcdefggffaabca" and k = 3?

7

8

9

6

Tags:
Share your thoughts in the comments