Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

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

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

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 = 1
Output: 7
Explanation: 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 = 2
Output: 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++




// 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 K
int 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 Code
int main()
{
    string str = "abab";
    int K = 1;
 
    cout << cntSubstr(str, K);
 
    return 0;
}

Java




// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to find the count of
// substrings such that frequency
// of each character is atmost K
static 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 Code
public static void main(String[] args)
{
    String str = "abab";
    int K = 1;
 
    System.out.println(cntSubstr(str, K));
}
}
 
// This code is contributed by ukasp

Python3




# Python Program to implement
# the above approach
 
# Function to find the count of
# substrings such that frequency
# of each character is atmost K
def 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 Code
str = "abab"
K = 1
print(cntSubstr(str, K))
 
# This code is contributed by Saurabh Jaiswal

C#




// C# program for the above approach
using 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 K
static 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 Code
public static void Main()
{
    string str = "abab";
    int K = 1;
     
    Console.Write(cntSubstr(str, K));
 
}
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript




<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>

Output

7

Time Complexity: O(N)
Auxiliary Space: O(N)

 


My Personal Notes arrow_drop_up
Last Updated : 14 Dec, 2021
Like Article
Save Article
Similar Reads
Related Tutorials