Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中,什么是针对一个大小写对一个字符串的多个子字符串的有效方法+;?_C++_String - Fatal编程技术网

C++ 在C+;中,什么是针对一个大小写对一个字符串的多个子字符串的有效方法+;?

C++ 在C+;中,什么是针对一个大小写对一个字符串的多个子字符串的有效方法+;?,c++,string,C++,String,我正在研究Hackerrank上的一些问题,我需要在删除1或0个元素后确定字符串是否与模式匹配。如果删除1或0个元素后,字符串中的每个字符都具有相同的频率,则我要打印“是”。否则我打印“否”。输入是一个介于1到10^5个字符之间的字符串。我所做的工作适用于琐碎的案例,但在一些测试案例中超时。我应该达到一些返回值,但我认为测试用例是非常大的输入,我的代码效率太低。特别是在使用擦除的情况下,我复制字符串n^2次,其中n是字符串的长度。我可以在适当的位置处理字符串,只跳过每个元素吗 #include

我正在研究Hackerrank上的一些问题,我需要在删除1或0个元素后确定字符串是否与模式匹配。如果删除1或0个元素后,字符串中的每个字符都具有相同的频率,则我要打印“是”。否则我打印“否”。输入是一个介于1到10^5个字符之间的字符串。我所做的工作适用于琐碎的案例,但在一些测试案例中超时。我应该达到一些返回值,但我认为测试用例是非常大的输入,我的代码效率太低。特别是在使用擦除的情况下,我复制字符串n^2次,其中n是字符串的长度。我可以在适当的位置处理字符串,只跳过每个元素吗

#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)…听起来不错。