【题目】
1、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
实现函数:
void stringFilter(const char *pInputStr, char *pOutputStr);
【输入】 pInputStr: 输入字符串
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
#include<iostream>
#include<string>
using namespace std;
void stringFilter(const char *pInputStr, int InputLen, char *pOutputStr)
{
int a[26]={0}; // 用来记录a-z字符出现的次数
const char *pstr=pInputStr;
char* pResult=pOutputStr;
while(*pstr!='\0')
{
a[*pstr-'a']++;
if(a[*pstr-'a']>1) pstr++;
else
{
*pResult=*pstr;
pstr++;
pResult++;
}
}
*pResult='\0';
}
//测试
void main()
{
char *in="afafafaf";
char *out=new char[strlen(in)+1];
stringFilter(in,out);
}
另解注:使用布尔型的简单hash表可以节省空间,用来存储字符是否出现的信息,刚开始hash表里面都是false,当第一次字符出现的时候,置成true,再次碰见的时候直接删除这个字符就行了
char* remove_multiple_char(char* str)
{
assert(str != NULL);
char* tmp = str;
char* tmp2 = str;
bool hashtable[256] = {false};
while(*tmp2 != '\0')
{
if (hashtable[*tmp2 -'\0']==false)
{
hashtable[*tmp2 -'\0'] =true;
*tmp++ = *tmp2++;
}
else
{
tmp2++;
}
}
*tmp = '\0';
return str;
}