针对C++中大小写的字符串的许多子字符串的有效方法是什么
What is an efficient way to many substrings of a string against a case in C++?
我正在Hackerrank上解决一些问题,我需要确定删除1或0元素后字符串是否与模式匹配。如果在删除 1 或 0 个元素后,字符串中的每个字符都具有相同的频率,那么我想打印"YES"。否则我打印"否"。输入是介于 1 到 10^5 个字符之间的字符串。我所拥有的适用于琐碎的情况,但在某些测试用例上超时。我应该达到一些返回值,但我认为测试用例只是非常大的输入,我的代码效率太低。特别是在我使用 erase 的地方,我复制字符串 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;
}
编辑:有人指出,这可以通过另一种内存密集度较低的方式解决。不过,我对最初的问题感到好奇:迭代字符串(或其他任何内容)并根据条件测试"字符串减去每个值"而无需每次都复制字符串的有效方法是什么?
我找到了一种方法,可以在不复制的情况下有效地对子列表进行操作。您必须能够访问指向字符串元素的指针,将字符串视为链表。因此,根据您希望如何更改字符串,您可以移动一个或多个指针,保存您修改的指针的值。
相关文章:
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 如何正确解析子字符串,以便它们对我的新手计算器有效?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 创建字符串数组的有效方法
- 访问包含P的有效索引时返回空格的C++字符串
- 如何有效地将一个大std::字符串的一部分转换为float
- C++Int有效地字符串
- 是否有更有效的方法来生成日期的REGEX字符串
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- 为C++字符串中的特殊符号 (") 赋予文字含义的有效C++方法
- 拆分字符串输入并查找字符是否有效
- 设计返回有效字符串的方法或函数
- 使用 pair<int、int> 或字符串作为 map<> 键,哪个更有效?
- 字符串只包含有效的字符?
- 如何更有效地计算n个字符串之间的不匹配分数?
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- 为什么字符串(常量字符* s,size_t pos,size_t len = npos)有效?
- 文字字符串有效,但字符串在 file.open() 中不起作用