Queries for frequencies of characters in substrings

Given a string s and Q number of queries. Each query Q consists of l and r and a character c. Find 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 count of each character in 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).

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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-procees 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 = 0; 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
    return cnt[r] - cnt[l - 1];
}
  
// 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;
}

chevron_right


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-procees 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(0, 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



Output:

2
1
0
4


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : rituraj_jain