Count of substrings of given string with frequency of each character at most K - GeeksforGeeks

14 Dec, 2021
Given a string str, the task is to calculate the number of substrings of the given string such that the frequency of each element of the string is almost K.
Examples:
Input: str = “abab”, K = 1Output: 7Explanation: The substrings such that the frequency of each character is atmost 1 are “a”, “b”, “a”, “b”, “ab”, “ba” and “ab”.
Input: str[] = “xxyyzzxx”, K = 2Output: 33
Approach: The given problem can be solved using the two-pointer technique. Iterate through each character of the string in the range [0, N) and maintain the frequency of each character in an unordered map. Create a variable ptr, which stores the index of the starting point of the current window. Initially, the value of ptr is 0. For index i, if the frequency of str[i] is less than or equal to K, add (i – ptr + 1) into the substring count, otherwise, increment the value of ptr until str[i] > K. 
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to find the count of// substrings such that frequency// of each character is atmost Kint cntSubstr(string str, int K){    // Stores the size of string    int N = str.size();     // Stores the final count    int ans = 0;     // Stores the starting index    int ptr = 0;     // Stores the frequency of    // characters of string    unordered_map<char, int> m;     // Loop to iterate through string    for (int i = 0; i < N; i++) {         // Increment the frequency of        // the current character        m[str[i]]++;         // While the frequency of char is        // greater than K, increment ptr        while (m[str[i]] > K && ptr <= i) {            m[str[ptr]]--;            ptr++;        }         // Update count        ans += (i - ptr + 1);    }     // Return Answer    return ans;} // Driver Codeint main(){    string str = "abab";    int K = 1;     cout << cntSubstr(str, K);     return 0;}
// Java program for the above approachimport java.util.*; class GFG{ // Function to find the count of// substrings such that frequency// of each character is atmost Kstatic int cntSubstr(String str, int K){         // Stores the size of string    int N = str.length();     // Stores the final count    int ans = 0;     // Stores the starting index    int ptr = 0;     // Stores the frequency of    // characters of string    HashMap<Character,            Integer> m = new HashMap<Character,                                     Integer>();     // Loop to iterate through string    for(int i = 0; i < N; i++)    {                 // Increment the frequency of        // the current character        int count = 0;        if (m.containsKey(str.charAt(i)))        {            count = m.get(str.charAt(i));        }        m.put(str.charAt(i), count + 1);         // While the frequency of char is        // greater than K, increment ptr        while (m.get(str.charAt(i)) > K && ptr <= i)        {            m.put(str.charAt(ptr),                  m.get(str.charAt(ptr)) - 1);            ptr++;        }         // Update count        ans += (i - ptr + 1);    }     // Return Answer    return ans;} // Driver Codepublic static void main(String[] args){    String str = "abab";    int K = 1;     System.out.println(cntSubstr(str, K));}} // This code is contributed by ukasp
# Python Program to implement# the above approach # Function to find the count of# substrings such that frequency# of each character is atmost Kdef cntSubstr(str, K):       # Stores the size of string    N = len(str)     # Stores the final count    ans = 0     # Stores the starting index    ptr = 0     # Stores the frequency of    # characters of string    m = {}     # Loop to iterate through string    for i in range(N) :         # Increment the frequency of        # the current character        if (str[i] in m):            m[str[i]] += 1        else:            m[str[i]] = 1         # While the frequency of char is        # greater than K, increment ptr        while (m[str[i]] > K and ptr <= i):            m[str[ptr]] -= 1            ptr += 1                 # Update count        ans += (i - ptr + 1)     # Return Answer    return ans # Driver Codestr = "abab"K = 1print(cntSubstr(str, K)) # This code is contributed by Saurabh Jaiswal
// C# program for the above approachusing System;using System.Collections;using System.Collections.Generic; class GFG{   // Function to find the count of// substrings such that frequency// of each character is atmost Kstatic int cntSubstr(string str, int K){       // Stores the size of string    int N = str.Length;     // Stores the final count    int ans = 0;     // Stores the starting index    int ptr = 0;     // Stores the frequency of    // characters of string    Dictionary<char, int> m =          new Dictionary<char, int>();               // Loop to iterate through string    for (int i = 0; i < N; i++) {         // Increment the frequency of        // the current character        int count = 0;        if (m.ContainsKey(str[i])) {                             count = m[str[i]];        }        m[str[i]] = count + 1;         // While the frequency of char is        // greater than K, increment ptr        while (m[str[i]] > K && ptr <= i) {            m[str[ptr]]--;            ptr++;        }         // Update count        ans += (i - ptr + 1);    }     // Return Answer    return ans;} // Driver Codepublic static void Main(){    string str = "abab";    int K = 1;         Console.Write(cntSubstr(str, K)); }} // This code is contributed by Samim Hossain Mondal.
<script>        // JavaScript Program to implement       // the above approach        // Function to find the count of       // substrings such that frequency       // of each character is atmost K       function cntSubstr(str, K) {           // Stores the size of string           let N = str.length;            // Stores the final count           let ans = 0;            // Stores the starting index           let ptr = 0;            // Stores the frequency of           // characters of string           let m = new Map();            // Loop to iterate through string           for (let i = 0; i < N; i++) {                // Increment the frequency of               // the current character               if (m.has(str.charAt(i)))                   m.set(str[i], m.get(str[i]) + 1);               else                   m.set(str[i], 1);                // While the frequency of char is               // greater than K, increment ptr               while (m.get(str[i]) > K && ptr <= i) {                   m.set(str[ptr], m.get(str[ptr]) - 1);                   ptr++;               }                // Update count               ans += (i - ptr + 1);           }            // Return Answer           return ans;       }        // Driver Code       let str = "abab";       let K = 1;        document.write(cntSubstr(str, K));    // This code is contributed by Potta Lokesh   </script>
7
Time Complexity: O(N)Auxiliary Space: O(N)
 
lokeshpotta20
samim2000
mostaptname
_saurabh_jaiswal
ukasp
frequency-counting
substring
Arrays
Hash
Strings
Arrays
Hash
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Window Sliding Technique
Building Heap from Array
Trapping Rain Water
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Internal Working of HashMap in Java
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)
Count pairs with given sum
Hashing | Set 2 (Separate Chaining)