给定一个字符串,去除整个字符串中重复的字符
2013-11-27 21:49
375 查看
该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论: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';
}
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';
}
相关文章推荐
- 给定一个字符串,求第一个不重复的字符
- 给定一个字符串,去重(重复的字符只保留第一次出现的)
- 题目:剔除一个字符中重复的字符,然后按ASCII码值从小到大排列。 例如,输入:abbcccddeeeffgghh 输出:abcdefgh 注意:1、剔除是整个字符串中重复的字符,而不是连续的字符 2
- 给定一个字符串,找到最长的子串的长度没有重复字符
- 实现给定一个字符串剔除重复字符,并统计各个字符出现的次数
- 给定一个字符串,查找该字符串中第一个重复出现的字符索引。要求:时间复杂度为O(n)。
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个stri
- 递归实现一个去除字符串中“重复出现的字符”
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 去除一个字符串中出现的重复字符,并计算出出现最多次的字符的出现次数
- leetcode-java.T003_LongestSubstringWithoutRepeatingCharacters 给定一个字符串,找字符中的最大非重复子串
- 给定任意一个字符串,找出所有重复字符的重复的次数
- 05年华中科大机试第一题(对给定的一个字符串,找出有重复的字符,并给出其位置)
- 给定一个字符串,求第一个不重复的字符
- 求给定的某一个字符串中的最长的没有重复字符的子串的长度
- 给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。
- 编写一个函数,从一个字符串中去除多余的空格。当函数发现字符串中有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1