Open In App

Queries for frequencies of characters in substrings

Improve
Improve
Like Article
Like
Save
Share
Report

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.



Last Updated : 18 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads