如何有效地从另一个字符串中找到的字符串中删除重复字符?
Posted
技术标签:
【中文标题】如何有效地从另一个字符串中找到的字符串中删除重复字符?【英文标题】:How can I efficiently delete a repeated character from a string that has already been found in another string? 【发布时间】:2021-03-03 18:41:10 【问题描述】:以这个字符串为例(“Hello World”)。如果您搜索此字符串中的每个元音并输出它,您将得到 eoo。在这种情况下,我希望不再找到 'o',所以它只剩下 e 和 o。
这是从“Hello World”输出“eoo”的代码。
char a[256], v[6]="aeiou";
cin.get(a, 256);
for(int i = 0; i < strlen(a); i++)
if(strchr(v, a[i]))
cout << a[i];
我考虑过删除从 v 中找到的每个元音,
因此,如果您发现 a[i] 是元音,请从 v 中删除该元音(例如,如果 a[i] 是 e,则 v 变为 aiou。
我想知道这是否是最有效的方法。
【问题讨论】:
首先,您没有string
,而是一个固定长度的char[]
数组,并且您不能删除其中的任何字符。您可以做的是从右侧移入任何字符,并在新长度处添加另一个NUL
。
出于纯粹的病态好奇心,如果一个字符在 both 字符串中多次出现,您的预期行为会是什么。 IE。 `“Hello, World”是你的源字符串,“aeioou”是你的过滤器集?
扩展上述内容,您可以使用数组做的最好的事情是将所有内容移到您想要向左移动一个空格的字符的右侧以覆盖“已删除”字符。不要忘记保留终止的 null。
如果您关心“最有效”,您可能会问自己要拨打多少次strlen(a)
【参考方案1】:
我考虑过删除从 v 中找到的每个元音,
很有可能。
请注意,如果搜索的元素数量很大,那么使用诸如std::unordered_set
或类似的东西会更有效。对于元音等较小的集合,线性搜索可能是最优的。
【讨论】:
以上是关于如何有效地从另一个字符串中找到的字符串中删除重复字符?的主要内容,如果未能解决你的问题,请参考以下文章