이 문제에서는 각각 두 개의 정수로 구성된 문자열 str과 Q 쿼리가 제공됩니다. 우리의 임무는 C++에서 주어진 문자열의 하위 문자열에서 반복되지 않는 마지막 문자를 찾기 위해 쿼리를 해결하는 프로그램을 만드는 것입니다.
문제 설명
각 쿼리에는 두 개의 정수 L과 R이 있습니다. 쿼리를 해결하기 위해 인덱스 L에서 시작하여 인덱스 R까지 하위 문자열을 사용합니다. 그리고 하위 문자열에서 반복되지 않는 마지막 문자를 찾습니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력 :str ="튜토리얼 포인트" Q =2
쿼리 ={{4, 8}, {2, 6}}
출력 :-1 , -1
설명
subStr[4...8] ="리알". 반복되지 않는 마지막 문자는 s입니다. 그러나 모든 문자의 빈도는 1입니다.
subStr[2...6] ="토리아". 반복되지 않는 마지막 문자는 입니다. 그러나 모든 문자의 빈도는 1입니다.
해결 방법
문제를 해결하려면 단일 발생 빈도를 가진 문자를 찾아야 합니다. 이를 위해 쉽고 간단한 접근 방식은 charFreq[][]를 계산하는 행렬을 만드는 것입니다. 하위 배열 쿼리를 해결하기 위해 모든 문자의 발생 빈도를 확인하고 빈도가 1인 마지막 문자를 반환합니다.
예
#include<bits/stdc++.h>
using namespace std;
int charFreq[256][1000] = {0};
void initialiseCharFrequency(string str, int n) {
charFreq[(int)str[0]][0] = 1;
for (int i = 1; i < n; i++) {
char ch = str[i];
for (int j = 0; j < 256; j++) {
char charToUpdate = (char)j;
if (charToUpdate == ch)
charFreq[j][i] = charFreq[j][i - 1] + 1;
else
charFreq[j][i] = charFreq[j][i - 1];
}
}
}
string returnCharFromString(char x) {
string s(1, x);
return s;
}
string lastUniqueChar(string str, int n, int start, int end) {
for (int i = end; i >= start; i--) {
char ch = str[i];
if ((charFreq[(int)ch][end] - charFreq[(int)ch][start - 1]) ==1)
return returnCharFromString(ch);
}
return "-1";
}
int main() {
string str = "TutorialsPoint";
int len = str.length();
int Q = 3;
int query[Q][2] = { { 2, 9 }, { 2, 3 }, { 0, 12 } };
initialiseCharFrequency(str, len);
for (int i = 0; i < Q; i++)
cout<<"\nFor Query "<<(i+1)<<": The last non-repeating character in the sub-string of a given string is "<<lastUniqueChar(str, len,query[i][0], query[i][1]);
} 출력
For Query 1: The last non-repeating character in the sub-string of a given string is P For Query 2: The last non-repeating character in the sub-string of a given string is o For Query 3: The last non-repeating character in the sub-string of a given string is n입니다.