以下代码解决了在字符串中删除重复字符的问题。
void removeDuplicatesEff(char *str)
{
if (!str)
return;
int len = strlen(str);
if (len < 2)
return;
const int sz = (1<<CHAR_BIT);
bool hit[sz] = {false};
int tail = 0;
for (int i=0; i<len; ++i)
{
if (!hit[str[i]])
{
str[tail] = str[i];
++tail;
hit[str[i]] = true;
}
}
str[tail] = 0;
}
在最后一步设置str[tail]=0
之后,如果char *str
包含重复字符,则它的大小将变小,即tail
。但我想知道这里是否存在内存泄漏?似乎我们不能释放原始char *str
分配的所有空间。是这样吗?如果是这样,我们该如何解决这种情况?
€
,需要考虑使用扩展ASCII码。 - herohuyongtao<limits.h>
中定义了CHAR_BIT
,它表示char
类型的位数。它必须至少为8,但在理论上没有最大值(N1570(C11之前的草案)§5.2.4.2.1/1)。对于可读性而言,符号常量总是优于魔法数字。 - Casey