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

`// 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*

*filter_none*

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

Output:

2 1 0 4

## Recommended Posts:

- Range Queries for Frequencies of array elements
- XOR of Prime Frequencies of Characters in a String
- Subsequence queries after removing substrings
- Check whether the frequencies of all the characters in a string are prime or not
- Sum and Product of Prime Frequencies of Characters in a String
- Print characters and their frequencies in order of occurrence
- Print characters having odd frequencies in order of occurrence
- Character whose frequency is equal to the sum of frequencies of other characters of the given string
- Count substrings with same first and last characters
- Count distinct substrings that contain some characters at most k times
- Recursive solution to count substrings with same first and last characters
- Count number of substrings with exactly k distinct characters
- Find number of substrings of length k whose sum of ASCII value of characters is divisible by k
- Queries for characters in a repeated string
- Minimum number of operations to move all uppercase characters before all lower case characters

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.