이 문제에서는 문자열이 제공됩니다. 그리고 Q 쿼리에는 각각 두 개의 정수 l과 r과 문자 ch가 있습니다. 우리의 임무는 C++의 부분 문자열에서 문자의 빈도에 대한 쿼리를 해결하는 프로그램을 만드는 것입니다.
문제 설명 :여기에서 각 쿼리에 대해 부분 문자열 str[l...r]에서 문자 'ch'의 발생 빈도를 찾습니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력
str = “tutorialspoint” Q = 2 0 6 t 5 13 i
출력
2 2
설명
쿼리 1의 경우 - 부분 문자열이 "tutoria"이고 문자 t가 2번 나타납니다.
쿼리 2의 경우 - 부분 문자열은 "ialspoint"이고 문자 i는 2번 나타납니다.
솔루션 접근 방식
문제를 해결하기 위한 쉽고 직접적인 접근 방식은 각 쿼리에 대해 문자열을 l에서 r로 순회하고 문자열에서 문자 ch의 발생을 계산하는 것입니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include <bits/stdc++.h>
using namespace std;
struct Query{
int l, r;
char ch;
};
int CalcCharFreq(string str, Query queries){
int count = 0;
for(int i = queries.l; i < queries.r; i++){
if(str[i] == queries.ch )
count++;
}
return count;
}
int main(){
string str = "tutorialspoint";
int Q = 2;
Query queries[Q];
queries[0].l = 0;
queries[0].r = 5;
queries[0].ch = 't';
queries[1].l = 5;
queries[1].r = 13;
queries[1].ch = 'i';
for(int i = 0; i<Q; i++)
cout<<"For Query "<<(i+1)<<": The frequency of occurrence of character '"<<queries[i].ch<<"' is "<<CalcCharFreq(str, queries[i])<<"\n";
return 0;
} 출력
For Query 1: The frequency of occurrence of character 't' is 2 For Query 2: The frequency of occurrence of character 'i' is 2
또 다른 접근 방식 문제를 해결하는 방법은 미리 계산된 배열을 사용하는 것입니다. 여기에서 특정 인덱스까지의 문자 빈도를 저장할 2D 배열을 생성합니다. 즉, freq[3][2]는 인덱스 2에서 문자 'c'의 빈도를 저장합니다. 처음에는 모든 빈도가 0입니다.피>
그런 다음 모든 인덱스 값에서 문자의 빈도를 미리 계산합니다. 그런 다음 인덱스 r에서 발생 빈도에서 인덱스 l에서 발생 빈도를 빼서 범위 내 문자의 빈도를 찾습니다.
문제를 이해하기 위해 예를 들어보겠습니다.
예시
#include <bits/stdc++.h>
using namespace std;
int charFreq[100][26];
struct Query{
int l, r;
char ch;
};
void countCharFreq(string str, int size){
memset(charFreq, 0, sizeof(int));
for (int i = 0; i < size; i++){
charFreq[i][str[i] - 'a']++;
}
for (int i = 1; i < size; i++) {
for (int j = 0; j < 26; j++)
charFreq[i][j] += charFreq[i - 1][j] ;
}
}
int CalcCharFreq(Query queries){
return charFreq[queries.r][queries.ch - 'a'] - charFreq[queries.l][queries.ch - 'a'];
}
int main(){
string str = "tutorialspoint";
int size = str.length();
int Q = 2;
countCharFreq(str, size);
Query queries[Q];
queries[0].l = 1;
queries[0].r = 13;
queries[0].ch = 't';
queries[1].l = 4;
queries[1].r = 13;
queries[1].ch = 'i';
for(int i = 0; i<Q; i++)
cout<<"For Query "<<(i+1)<<": The frequency of occurrence of character '"<<queries[i].ch<<"' is " <<CalcCharFreq( queries[i])<<"\n";
return 0;
} 출력
For Query 1: The frequency of occurrence of character 't' is 2 For Query 2: The frequency of occurrence of character 'i' is 2