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