因为删除的是小写字母字符串,所以开辟一个数组b[26]
首先初始化b全部为false
如果对应的b[arr[i]]是false,则将false置为true,同时将arr[j] = arr[i],++j
(也就是说,假如该字符串为aaaabb,则在第一次遇到a时,将false置为true,后面在遇到a时,不在满足if条件,当遇到b时,此时i=4,j=1,将arr[j] = arr[i],也就是把b放在a后面
最后,在arr[j]位置放上’/0’
void RemoveSameElement(char* arr)
{
bool b[26];
memset(b, 0, sizeof(b));
int j = 0;
for (int i = 0; i < strlen(arr); ++i)
{
if (!b[arr[i]])
{
b[arr[i]] = true;
arr[j] = arr[i];
++j;
}
}
arr[j] = '\0';
}
除此以外,对代码进行优化。
还可以用位示图来解决,只需要一个int(4字节32位)即可实现。
void RemoveSameElement2(char s[])
{
unsigned int check = 0;
int len = strlen(s);
int j = 0;
int v = 0;
for (int i = 0; i < len; i++)
{
v = s[i] - 'a';
if (!(check & (1 << v)))
{
s[j] = s[i];
j++;
check |= (1 << v);
}
}
s[j] = '\0';
}

509

被折叠的 条评论
为什么被折叠?



