C++ 在C+;中,什么是针对一个大小写对一个字符串的多个子字符串的有效方法+;?
我正在研究Hackerrank上的一些问题,我需要在删除1或0个元素后确定字符串是否与模式匹配。如果删除1或0个元素后,字符串中的每个字符都具有相同的频率,则我要打印“是”。否则我打印“否”。输入是一个介于1到10^5个字符之间的字符串。我所做的工作适用于琐碎的案例,但在一些测试案例中超时。我应该达到一些返回值,但我认为测试用例是非常大的输入,我的代码效率太低。特别是在使用擦除的情况下,我复制字符串n^2次,其中n是字符串的长度。我可以在适当的位置处理字符串,只跳过每个元素吗C++ 在C+;中,什么是针对一个大小写对一个字符串的多个子字符串的有效方法+;?,c++,string,C++,String,我正在研究Hackerrank上的一些问题,我需要在删除1或0个元素后确定字符串是否与模式匹配。如果删除1或0个元素后,字符串中的每个字符都具有相同的频率,则我要打印“是”。否则我打印“否”。输入是一个介于1到10^5个字符之间的字符串。我所做的工作适用于琐碎的案例,但在一些测试案例中超时。我应该达到一些返回值,但我认为测试用例是非常大的输入,我的代码效率太低。特别是在使用擦除的情况下,我复制字符串n^2次,其中n是字符串的长度。我可以在适当的位置处理字符串,只跳过每个元素吗 #include
#include <iostream>
#include <string>
using namespace std;
long countFreq(char someChar,string someStr){
long count = 0;
for(int i=0;i<someStr.size();i++){
if(someStr[i] == someChar)count += 1;
}
return count;}
bool allSameFreq(string someStr){
long freq = countFreq(someStr[0],someStr);
for(char someChr:someStr){
if(countFreq(someChr,someStr)!=freq)return false;
}
return true;}
int main(){
string pattern;
cin>>pattern;
if(allSameFreq(pattern)==true){cout<<"YES";return 0;}
else {
for(int i=0;i<pattern.size();i++){
string copy = pattern;
copy.erase(i,1);
if(allSameFreq(copy)==true){cout<<"YES";return 0;}
}
cout<<"NO";
}
return 0;
}
#包括
#包括
使用名称空间std;
长countFreq(char-someChar,string-someStr){
长计数=0;
对于(int i=0;i>pattern;
如果(allSameFreq(模式)==真){cout我发现了一种方法,它可以在不复制副本的情况下有效地对子列表进行操作。您必须能够访问指向字符串元素的指针,将字符串视为链表。因此,根据您想要更改字符串的方式,您可以移动一个或几个指针,保存您修改的指针的值。我发现了一种方法,它可以有效地在不复制的情况下,对子列表进行间接操作。您必须能够访问指向字符串元素的指针,将字符串视为链表。因此,根据您想要更改字符串的方式,您可以移动一个或几个指针,保存您修改的指针的值。我不确定是否理解……您不能只计算频率吗每个字符的cy,如果一个字符的值太高,那么答案是肯定的?添加到@JamesRoot注释:您需要在字符串上迭代一次,并存储数组中所有字符的频率。例如,使用std::map cm
。存储频率所需做的只是说cm[ch]++
,其中,ch
是您读入的字符串中的每个字符。从这里开始——其余的应该很简单。@MaxZS:@PaulMcKenzie:所以在将计数放入映射后,如果所有值都相同,或者(如果所有值都相同,除了一个和abs(freqCount1-freqCount2)==1)…听起来不错。我不确定我是否理解…难道你不能计算每个字符的频率吗?如果一个字符的频率太高,那么答案是肯定的?添加到@JamesRoot注释:你需要在字符串上迭代一次,并存储数组中所有字符的频率。例如,使用std::map cm
,而不是所有需要的存储频率的方法是说cm[ch]++
,其中ch
是您读入的字符串中的每个字符。从这里开始——其余的应该很简单。@MaxZS:@PaulMcKenzie:所以在将计数放入映射后,如果所有值都相同,或者(如果所有值都相同,除了一个和abs(freqCount1-freqCount2)==1)…听起来不错。