给定字符串,要求除去字符串中重复出现的字符
2012-09-22 13:23
246 查看
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。笔试会碰到这种题目,有的题目要求会多一条,就是不许重新分配存储空间来临时存储字符串,即节省空间的原则。综合两个博客的研究结果
(http://blog.csdn.net/luno1/article/details/7945227,http://blog.csdn.net/luno1/article/details/8001892),自己做下总结,同时也方便大家参考,分析完种种情况之后,会不由自主的想到,其实这就是对hash表的拓展应用。
首先看允许创建存储空间的情形:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void string_filter(char *str,char *dest)
{
char *pin=str;
char *pout=dest;
int hash[26]={0};
while(*pin!='\0')
{
if(hash[*pin-'a']==0)//如果字符之前没有出现,则将对应的hash数组中的位标记为1,表示字符已经出现。
{
hash[*pin-'a']=1;
*pout=*pin;
pout++;
pin++;
}
else
{
pin++;
}
}
*pout='\0';
}
void main()
{
char str[]="abacacde";
char *dest=(char*)malloc(strlen(str)+1);
string_filter(str,dest);
printf("%s\n",dest);
}
不许创建空间的情况:
char* remove_multiple_char(char*
str)
{
assert(str != NULL);
char* tmp = str;
char* tmp2 = str;
bool hash_table[256] = {false};
while(*tmp2 != '\0')
{
if (!hash_table[*tmp2 - '\0'])
{
hash_table[*tmp2 - '\0'] = true;
*tmp++ = *tmp2++;
}
else
{
tmp2++;
}
}
*tmp = '\0';
return str;
}
问题扩展,就是那个所谓的“和谐系统”:给定字符串str:abc,找出包含此字符串的所有字符串,比如a.....b...c,
ac....b.....之类的都要找出来。这就是典型的对hash表的应用。还有,不知道大家还记得这个题目没有,就是给定n-1个从1到n的数字,他们的顺序被打乱,请在线性时间内找出没有出现的那个数字,这个也是hash表的应用。相信大家如果能理解这几个问题,以后遇到此类的变种问题会很快能想到应用hash表。
(http://blog.csdn.net/luno1/article/details/7945227,http://blog.csdn.net/luno1/article/details/8001892),自己做下总结,同时也方便大家参考,分析完种种情况之后,会不由自主的想到,其实这就是对hash表的拓展应用。
首先看允许创建存储空间的情形:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void string_filter(char *str,char *dest)
{
char *pin=str;
char *pout=dest;
int hash[26]={0};
while(*pin!='\0')
{
if(hash[*pin-'a']==0)//如果字符之前没有出现,则将对应的hash数组中的位标记为1,表示字符已经出现。
{
hash[*pin-'a']=1;
*pout=*pin;
pout++;
pin++;
}
else
{
pin++;
}
}
*pout='\0';
}
void main()
{
char str[]="abacacde";
char *dest=(char*)malloc(strlen(str)+1);
string_filter(str,dest);
printf("%s\n",dest);
}
不许创建空间的情况:
char* remove_multiple_char(char*
str)
{
assert(str != NULL);
char* tmp = str;
char* tmp2 = str;
bool hash_table[256] = {false};
while(*tmp2 != '\0')
{
if (!hash_table[*tmp2 - '\0'])
{
hash_table[*tmp2 - '\0'] = true;
*tmp++ = *tmp2++;
}
else
{
tmp2++;
}
}
*tmp = '\0';
return str;
}
问题扩展,就是那个所谓的“和谐系统”:给定字符串str:abc,找出包含此字符串的所有字符串,比如a.....b...c,
ac....b.....之类的都要找出来。这就是典型的对hash表的应用。还有,不知道大家还记得这个题目没有,就是给定n-1个从1到n的数字,他们的顺序被打乱,请在线性时间内找出没有出现的那个数字,这个也是hash表的应用。相信大家如果能理解这几个问题,以后遇到此类的变种问题会很快能想到应用hash表。
相关文章推荐
- 给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。
- 给定一个字符串,查找该字符串中第一个重复出现的字符索引。要求:时间复杂度为O(n)。
- 给定一个字符串,去重(重复的字符只保留第一次出现的)
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个stri
- 给定一字符串,求字符串中第一次出现的非重复的字符,例如abaaedgff,输出b.(Java 实现)
- 实现给定一个字符串剔除重复字符,并统计各个字符出现的次数
- 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
- Java实现给定任一字符串,长度为任意,要求找出其出现次数最多的字符及其出现次数。
- JavaScript计算一个字符串最多重复的字符及出现次数
- 用Java正则去掉字符串中重复出现的字符
- java统计字符串中重复字符出现次数的方法
- 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。
- 由abcd四个字符取5个作允许重复的排列,要求a出现次数不超过2次,但不能不出现;b不超过1个;c不超过3个;d出现的次数为偶数。求满足以上条件的排列数。
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
- 05年华中科大机试第一题(对给定的一个字符串,找出有重复的字符,并给出其位置)
- 确定字符互异 确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
- 去除一个字符串中出现的重复字符,并计算出出现最多次的字符的出现次数
- 华为机试:将字符串里第一次出现的字符输出,重复出现的不显示
- 计算给定字符串中每个字符出现的次数,并以指定格式输出,例如aabbbc输出a2b3c1(java语言)