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

Related Articles

Queries for frequencies of characters in substrings

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

Given a string s and Q number of queries. Each query Q consists of l and r and a character c. Find the frequency of character c in substring l to r.

Examples: 

Input : s = geeksforgeeks
        4
        0 5 e
        2 6 f
        4 7 m
        0 12 e
Output : 2
         1
         0
         4
Substring from 0 to 5 is geeksf.
Here e occurs 2 times.

Input : s = apple
        2
        0 4 e
        1 2 p        
Output : 1
         2 

Naive Approach: Run a loop from l to r for Q number of queries. Count occurrence of character and return count. Overall time complexity will be Q * O(|s|).

Efficient Approach: We can pre-compute the count for each character. Store the count of each character in a 2-D array. Return frequency of character from 0 to r minus frequency of character in range 0 to l in O(1). Overall time complexity will be Q * O(1).

Implementation:

C++




// CPP program to find occurrence
// of character in substring l to r
#include <bits/stdc++.h>
#define MAX_LEN 1005
#define MAX_CHAR 26
 
using namespace std;
 
// To store count of all character
int cnt[MAX_LEN][MAX_CHAR];
 
// To pre-process string from
// 0 to size of string
void preProcess(string s)
{
    int n = s.length();
 
    // Initializing cnt with 0
    memset(cnt, 0, sizeof(cnt));
 
    // Store occurrence of
    // character i
    for (int i = 0; i < n; i++)
        cnt[i][s[i] - 'a']++;
 
    // Store occurrence o
    // all character upto i
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < 26; j++)
            cnt[i][j] += cnt[i - 1][j];
    }
}
 
// To return occurrence of
// character in range l to r
int findCharFreq(int l, int r, char c)
{
    // Return occurrence of character
    // from 0 to r minus its
    // occurrence from 0 to l
    int count = cnt[r][c-'a'];
   
    if (l != 0)
        count -= cnt[l - 1][c-'a'];
    return count;
}
 
// Driver program to test above functions
int main()
{
    string s = "geeksforgeeks";
    int Q = 4;
    preProcess(s);
 
    cout << findCharFreq(0, 5, 'e') << endl;
    cout << findCharFreq(2, 6, 'f') << endl;
    cout << findCharFreq(4, 7, 'm') << endl;
    cout << findCharFreq(0, 12, 'e') << endl;
 
    return 0;
}

Java




// Java program to find occurrence
// of character in substring l to r
import java.util.*;
 
class GFG
{
 
static int MAX_LEN = 1005;
static int MAX_CHAR = 26;
 
// To store count of all character
static int [][]cnt = new int[MAX_LEN][MAX_CHAR];
 
// To pre-process string from
// 0 to size of string
static void preProcess(String s)
{
    int n = s.length();
 
    // Store occurrence of
    // character i
    for (int i = 0; i < n; i++)
        cnt[i][s.charAt(i) - 'a']++;
 
    // Store occurrence o
    // all character upto i
    for (int i = 1; i < n; i++)
    {
        for (int j = 0; j < 26; j++)
            cnt[i][j] += cnt[i - 1][j];
    }
}
 
// To return occurrence of
// character in range l to r
static int findCharFreq(int l, int r, char c)
{
    // Return occurrence of character
    // from 0 to r minus its
    // occurrence from 0 to l
    return (cnt[r][(c) - 97] - cnt[l][(c) - 97]);
}
 
// Driver Code
public static void main(String[] args)
{
    String s = "geeksforgeeks";
    int Q = 4;
    preProcess(s);
 
    System.out.println(findCharFreq(0, 5, 'e'));
    System.out.println(findCharFreq(2, 6, 'f'));
    System.out.println(findCharFreq(4, 7, 'm'));
    System.out.println(findCharFreq(0, 12, 'e'));
}
}
 
// This code is contributed by PrinciRaj1992

Python3




# Python3 program to find occurrence
# of character in substring l to r
MAX_LEN, MAX_CHAR = 1005, 26
 
# To store count of all character
cnt = [[0 for i in range(MAX_CHAR)]
          for j in range(MAX_LEN)]
 
# To pre-process string from
# 0 to size of string
def preProcess(s):
 
    n = len(s)
 
    # Store occurrence of character i
    for i in range(0, n):
        cnt[i][ord(s[i]) - ord('a')] += 1
 
    # Store occurrence o
    # all character upto i
    for i in range(1, n):
        for j in range(0, 26):
            cnt[i][j] += cnt[i - 1][j]
     
# To return occurrence of
# character in range l to r
def findCharFreq(l, r, c):
 
    # Return occurrence of character
    # from 0 to r minus its
    # occurrence from 0 to l
    return (cnt[r][ord(c) - 97] -
            cnt[l - 1][ord(c) - 97])
 
# Driver Code
if __name__ == "__main__":
 
    s = "geeksforgeeks"
    Q = 4
    preProcess(s)
 
    print(findCharFreq(0, 5, 'e'))
    print(findCharFreq(2, 6, 'f'))
    print(findCharFreq(4, 7, 'm'))
    print(findCharFreq(0, 12, 'e'))
 
# This code is contributed by Rituraj Jain
# and Edited by Md Azharuddin

C#




// C# program to find occurrence
// of character in substring l to r
using System;
 
class GFG
{
    static int MAX_LEN = 1005;
    static int MAX_CHAR = 26;
 
    // To store count of all character
    static int[,] cnt = new int[MAX_LEN,
                                MAX_CHAR];
 
    // To pre-process string from
    // 0 to size of string
    static void preProcess(string s)
    {
        int n = s.Length;
 
        // Store occurrence of
        // character i
        for (int i = 0; i < n; i++)
            cnt[i, s[i] - 'a']++;
 
        // Store occurrence o
        // all character upto i
        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < 26; j++)
                cnt[i, j] += cnt[i - 1, j];
        }
    }
 
    // To return occurrence of
    // character in range l to r
    static int findCharFreq(int l, int r, char c)
    {
        // Return occurrence of character
        // from 0 to r minus its
        // occurrence from 0 to l
        return (cnt[r, c - 97] - cnt[l, c - 97]);
    }
 
    // Driver code
    public static void Main(string[] args)
    {
        string s = "geeksforgeeks";
        int Q = 4;
        preProcess(s);
 
        Console.WriteLine(findCharFreq(0, 5, 'e'));
        Console.WriteLine(findCharFreq(2, 6, 'f'));
        Console.WriteLine(findCharFreq(4, 7, 'm'));
        Console.WriteLine(findCharFreq(0, 12, 'e'));
    }
}
 
// This code is contributed by
// sanjeev2552

Javascript




<script>
 
// JavaScript program to find occurrence
// of character in substring l to r
const MAX_LEN = 1005, MAX_CHAR = 26
 
// To store count of all character
let cnt = new Array(MAX_LEN);
 
for(let i = 0;i < MAX_LEN;i++){
    cnt[i] = new Array(MAX_CHAR).fill(0);
}
 
// To pre-process string from
// 0 to size of string
function preProcess(s){
 
    let n = s.length
 
    // Store occurrence of character i
    for(let i=0;i<n;i++){
        cnt[i][s.charCodeAt(i) - 'a'.charCodeAt(0)] += 1
    }
 
    // Store occurrence o
    // all character upto i
    for(let i=1;i<n;i++)
        for(let j=0;j<26;j++)
            cnt[i][j] += cnt[i - 1][j]
}
     
// To return occurrence of
// character in range l to r
function findCharFreq(l, r, c){
 
    // Return occurrence of character
    // from 0 to r minus its
    // occurrence from 0 to l
    let count = cnt[r][c.charCodeAt(0) - 97]
    
    if (l != 0)
        count -= cnt[l - 1][c.charCodeAt(0) - 97]
    return count
}
 
// Driver Code
 
let s = "geeksforgeeks"
let Q = 4
preProcess(s)
 
document.write(findCharFreq(0, 5, 'e'),"</br>")
document.write(findCharFreq(2, 6, 'f'),"</br>")
document.write(findCharFreq(4, 7, 'm'),"</br>")
document.write(findCharFreq(0, 12, 'e'),"</br>")
 
// This code is contributed by shinjanpatra
 
<script>

Output

2
1
0
4

Time Complexity: O(26*n), where n is the length of the given string.
Auxiliary Space: O(MAX_LEN * MAX_CHAR), where both are predefined values.


My Personal Notes arrow_drop_up
Last Updated : 18 Nov, 2022
Like Article
Save Article
Similar Reads
Related Tutorials