C++中查找给定字符串子串中最后一个不重复字符的查询
在这个问题中,我们给定字符串str和Q个查询,每个查询包含两个整数。我们的任务是创建一个程序来解决C++中查找给定字符串子串中最后一个不重复字符的查询。
问题描述
在每个查询中,我们有两个整数L和R。为了解决这些查询,我们将从索引L到索引R获取一个子字符串。并找到子字符串中最后一个不重复的字符。
让我们举个例子来理解这个问题:
输入:str = “Tutorialspoint” Q = 2
query = {{4, 8}, {2, 6}}
输出: -1 , -1
解释
subStr[4...8] = “rials”。最后一个不重复的字符是s。但所有字符的频率都是1。
subStr[2...6] = “toria”。最后一个不重复的字符是a。但所有字符的频率都是1。
解决方案
为了解决这个问题,我们需要找到出现频率为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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP