因为删除的是小写字母字符串,所以开辟一个数组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'; }