📜  查询以查找字符串S 中 L 到 R 范围内重复字符的总数

📅  最后修改于: 2021-09-07 04:06:25             🧑  作者: Mango

##### CPP
``````// 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
using namespace std;

// Vector of vector to store
// position of all characters
// as they appear in string
vector > 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;
}``````

##### Python3
``````# Python implementation to Find the total
# number of duplicate character in a
# range L to R for Q number of queries in a string S

import bisect

# Vector of vector to store
# position of all characters
# as they appear in string
v = [[] for _ in range(26)]

# Function to store position of each character
def calculate(s: str) -> None:

for i in range(len(s)):
# Inserting position of each
# character as they appear
v[ord(s[i]) - ord('a')].append(i)

# Function to calculate duplicate
# characters for Q queries
def query(L: int, R: int) -> None:

# Variable to count duplicates
duplicates = 0

# Iterate over all 26 characters
for i in range(26):

# Finding the first element which
# is less than or equal to L
first = bisect.bisect_left(v[i], L - 1)

# Check if first pointer exists
# and is less than R
if (first < len(v[i]) and v[i][first] < R):
# Incrementing first pointer to check
# if the next duplicate element exists
first += 1

# Check if the next element exists
# and is less than R
if (first < len(v[i]) and v[i][first] < R):
duplicates += 1

print(duplicates)

# Driver Code
if __name__ == "__main__":

s = "geeksforgeeks"

Q = 2

l1 = 1
r1 = 5
l2 = 4
r2 = 8

calculate(s)

query(l1, r1)
query(l2, r2)

# This code is contributed by sanjeev2552``````

``````1
0``````

`