C++ 删除字符串中紧跟两个元音的所有字符
可以删除紧跟着两个元音的字符串的所有字符,而无需字符数组的帮助,只使用“字符串”库 例如:C++ 删除字符串中紧跟两个元音的所有字符,c++,string,C++,String,可以删除紧跟着两个元音的字符串的所有字符,而无需字符数组的帮助,只使用“字符串”库 例如: priamo -> iamo 算法应为: 将构成for循环的字符串从0循环到string.length()-2,以防止溢出 将字符对与包含所有元音的字符数组进行比较 使用字符串库中的“擦除”功能删除元音前的位置 但是如果没有字符数组的帮助,我不知道如何实现第二点。有什么建议吗?他们在没有字符数组帮助的情况下说的可能意味着你不能做任何类型的缓冲。您可以使用const char元音[]=“aeiou”
priamo -> iamo
算法应为:
0
循环到string.length()-2
,以防止溢出但是如果没有字符数组的帮助,我不知道如何实现第二点。有什么建议吗?他们在没有字符数组帮助的情况下说的可能意味着你不能做任何类型的缓冲。您可以使用
const char元音[]=“aeiou”代码>当然
好吧,这可能是错误的,但应该给你一个想法和一个基础,让其他人来纠正:
string str="priamo";
const char vowels[]="aeiou";
size_t pos=0;
size_t vowels_piled_up=0;
while((pos=str.find_first_of(&vowels[0], pos+vowels_piled_up))!=string::npos)
{
if((pos+1)+1 >= str.size())//break if it is on the last 2
break;
if((strchr(&vowels[0], str[pos+1]))!=NULL)
{
str.erase(vowels_piled_up, pos-1-vowels_piled_up);
pos=0;
vowels_piled_up+=2;
}
else
++pos;
}
我建议使用:
@chris在aeee
案例中,算法应该给我ee
递归擦除一对元音前的字符,从零位置检查。当然,不使用字符数组的情况下“比较字符对和字符数组”是很棘手的。这些要求是从哪里来的?@Tolga,你学习了就可以做到。至于这个问题,字符串有一个擦除方法,所以XXXXXXXXXXXXXXXX aa应该变成aa?这很容易做到:找到最右边的一对元音,然后删除它们左边的所有内容。如果const char[]
不可接受,const std::string元音(“aeiou”)
也会玩同样的游戏注意“元音”的定义取决于语言。“y”可以被视为一个元音,就像许多其他重音版本一样,可以被视为是不同的。@EmilioGaravaglia——没错,但对于初学者来说,我认为添加复杂的语言环境处理不是一个好主意。我可以看出这并不包括两个元音在擦除操作后直接出现在前面的情况。i、 e.priaeamo=>ia ea mo=>str.earse(2,-1)。他们可能不在乎,但这将重复搜索s
中的每个字符,以查看它是否是元音n-1次。你应该使用any_of
而不是find(…)!=结束
@Dave nice,谢谢,关于重复搜索-为性能改进留出空间总是很好的。设置擦除时的小错误:代码检查it
是否没有指向字符串的开头,然后将其递减2。如果it
等于s.cbegin()+1
,这将产生一个垃圾值。@但PeteBecker不能<代码>标准::相邻的查找将永远不会返回prev(last)
。
std::string s{"priamo"};
auto is_vowel = [](char c) -> bool {
static const char vowels[] = "aeiou";
return std::any_of(std::begin(vowels), std::prev(std::end(vowels)),
[c](char d) { return c == d; } );
};
auto it = std::adjacent_find(s.crbegin(), s.crend(),
[&](char c, char d) { return is_vowel(c) && is_vowel(d); }).base();
if (it != s.cbegin())
s.erase(s.cbegin(), std::prev(it, 2));