该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论:1、不许使用额外的存储空间;2、可使用额外的存储空间
s表示待处理的字符串,l表示当前非重复字符的个数
1、不许使用额外的存储空间
对每个待处理的字符,可以考虑在后处理和在前处理
在后处理:对每个待处理的字符,假设为c,从该字符的后一个字符开始,直到字符串的末尾,如果有字符与c相同,就将该位置的字符标记为无效,处理完毕后,将c存在到s中的l位置上。
在前处理:对每个待处理的字符,假设为c,将c与s中的第0---(l-1)个字符相比较,如果有相同的,则处理c后面的一个字符;如果没有相同的,就将c存放到s的第l个位置上,然后在处理c后面的一个字符。
上述两种方法中第一种的时间复杂度为O(n*n),第二种的时间负载读为O(k*n),k为不同字符的总数,第二种方法的代码如下:
void removeDuplicateChar(char s[])
{
int i, j;
int length = strlen(s);
if(length < 2)
return;
int last = 1;
/*s[i]每次都是与前last不重复的字符相比较*/
for(i = 1; i < length; i++)
{
for(j = 0; j < last; j++)
{
if(s[i] == s[j])
break;
}