300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 给定一个字符串 去除整个字符串中重复的字符

给定一个字符串 去除整个字符串中重复的字符

时间:2022-09-09 21:46:19

相关推荐

给定一个字符串 去除整个字符串中重复的字符

该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论: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;}if(j == last)s[last++] = s[i];}s[last] = '\0';}

2、允许使用额外的存储空间

当可以使用额外的存储空间时,若可以使用较大的数组,例如char flag[256],数组中的每一个元素用来标记一个字符,在处理字符串时就先判断它在flag对应位置上的标记是否为0,若是则表示目前该字符还没有出现,因此将其存放在l位置上;反之,不对其作任何的处理。

但如若不能使用这么大的数组,就可以考虑用位表示,例如int flag[8],就可以用来表示256个数,处理的方法与使用char flag[256]是一样的。

当限定了字符的种类时,如在"a---z"之间,使用一个整型变量int flag就可以解决。

void removeDuplicateChar(char s[]){int i, v;int length = strlen(s);if(length < 2)return;int flag = 0;int last = 0;for(i = 0; i < length; ++i){v = (int)(s[0] - 'a');if((flag & (1 << v)) == 0){s[last++] = s[i];flag |= (1 << v);}}s[last] = '\0';}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。