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 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.
Please Login to comment...