Given a **string S** of **size N** consisting of lower case alphabets and **an integer Q which represents the number of queries for S**. Our task is to print the number of duplicate characters in the substring L to R for all the queries Q.

**Note:** *1 ≤N ≤ 10 ^{6} and 1 ≤ Q≤ 10^{6}*

**Examples:**

Input :

S = “geeksforgeeks”, Q = 2

L = 1 R = 5

L = 4 R = 8

Output :

1

0

Explanation:

For the first query ‘e’ is the only duplicate character in S from range 1 to 5.

For the second query theres is no duplicate character in S.

Input :

S = “Geekyy”, Q = 1

L = 1 R = 6

Output :

2

Explanation:

For the first query ‘e’ and ‘y’ are duplicate characters in S from range 1 to 6.

**Naive Approach: **

The naive approach would be to maintain a **frequency array** of size 26, to store the count of each character. For each query, given a range [L, R] we will traverse substring S[L] to S[R] and keep counting the occurrence of each character. Now, if the frequency of any character is greater than 1 then we would add 1 to answer.

**Efficient Approach:**

To solve the above problem in an efficient way we will **store the position of each character** as it appears in the string in a dynamic array. For each given query we will iterate over all the 26 lower case alphabets. If the current letter is in the substring S[L: R] then the next element of the first element which is **greater than or equal L** to in the corresponding vector should exist and be **less than or equal to R**.

Diagram below shows how we store characters in the dynamic array:

Below is the implementation of the above approach:

`// CPP implementation to Find the total ` `// number of duplicate character in a ` `// range L to R for Q number of queries in a string S ` ` ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Vector of vector to store ` `// position of all characters ` `// as they appear in string ` `vector<vector<` `int` `> > v(26); ` ` ` `// Function to store position of each character ` `void` `calculate(string s) ` `{ ` ` ` `for` `(` `int` `i = 0; i < s.size(); i++) { ` ` ` `// Inserting position of each ` ` ` `// character as they appear ` ` ` `v[s[i] - ` `'a'` `].push_back(i); ` ` ` `} ` `} ` ` ` `// Function to calculate duplicate ` `// characters for Q queries ` `void` `query(` `int` `L, ` `int` `R) ` `{ ` ` ` `// Variable to count duplicates ` ` ` `int` `duplicates = 0; ` ` ` ` ` `// Iterate over all 26 characters ` ` ` `for` `(` `int` `i = 0; i < 26; i++) { ` ` ` ` ` `// Finding the first element which ` ` ` `// is less than or equal to L ` ` ` `auto` `first = lower_bound(v[i].begin(), ` ` ` `v[i].end(), L - 1); ` ` ` ` ` `// Check if first pointer exists ` ` ` `// and is less than R ` ` ` `if` `(first != v[i].end() && *first < R) { ` ` ` `// Incrementing first pointer to check ` ` ` `// if the next duplicate element exists ` ` ` `first++; ` ` ` ` ` `// Check if the next element exists ` ` ` `// and is less than R ` ` ` `if` `(first != v[i].end() && *first < R) ` ` ` `duplicates++; ` ` ` `} ` ` ` `} ` ` ` ` ` `cout << duplicates << endl; ` `} ` ` ` `// Driver Code ` `int` `main() ` `{ ` ` ` `string s = ` `"geeksforgeeks"` `; ` ` ` ` ` `int` `Q = 2; ` ` ` ` ` `int` `l1 = 1, r1 = 5; ` ` ` `int` `l2 = 4, r2 = 8; ` ` ` ` ` `calculate(s); ` ` ` ` ` `query(l1, r1); ` ` ` `query(l2, r2); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

1 0

`

**Time complexity:** O( Q * 26 * log N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- String Range Queries to find the number of subsets equal to a given String
- Queries for Nth smallest character for a given range in a string
- Queries to print the character that occurs the maximum number of times in a given range
- Queries to find the last non-repeating character in the sub-string of a given string
- Queries to find the first non-repeating character in the sub-string of a string
- Range Queries to Find number of sub-arrays with a given xor
- String Range Queries to count number of distinct characters with updates
- Find total number of distinct years from a string
- Queries for rotation and Kth character of the given string in constant time
- Total character pairs from two strings, with equal number of set bits in their ascii value
- Find a string such that every character is lexicographically greater than its immediate next character
- Count number of indices such that s[i] = s[i+1] : Range queries
- Queries for number of array elements in a range with Kth Bit Set
- Count of elements having odd number of divisors in index range [L, R] for Q queries
- Find the character in first string that is present at minimum index in second string
- Queries to find frequencies of a string within specified substrings
- Range Queries to count elements lying in a given Range : MO's Algorithm
- Queries to find the count of vowels in the substrings of the given string
- Find k-th character of decrypted string | Set - 2
- Find the last non repeating character in string

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.