删除字符串中的重复字符

时间:2023-01-03 21:49:00
删除字符串中的重复字符

实现函数int GetResult(char *input, char *output), 要求给定一个字符串,将字符串中所有和前面重复多余的字符删除,其余字符保留,输出处理后的字符串,需要保留字符出现的

先后顺序。


例如: 

输入: 

input = "adfageetj234jbjaf";

输出:

output = "adfgetj234b";


#include <iostream>
#include <set>
using namespace std;

#define USINGHASHTABLE 0
#define NOUSEHASHTABLE 0
#define USINGSET 1

int GetResult( char *input, char *output );


int main()
{
char *str = "adfageetj234jbjaf";
char output[200] = {'\0'};

if( 0== GetResult( str, output ))
cout<<str<<endl<<output<<endl;

system( "pause" );
return 0;
}




/**********************************************************************************************************************************
* Function:GetResult
* Author:Sky
* Description: 将字符串中所有和前面重复多余的字符删除,

其余字符保留,输出处理后的字符串,需要保留字符出现的先后顺序
* Access Level:
* Input: input----------指向输入字符串
output---------指向输出字符串
* Output: 0 ------- 成功
-1------- 失败
* Return:
***********************************************************************************************************************************/
int GetResult( char *input, char *output )
{

//方法一: 使用一个hash表当字典,对统计字符是否出现过 O(n)

#if USINGHASHTABLE

int rt = 0;
int i = 0, j = 0;
int hashTable[256] = {0};//0代表该字符在字符串中未出现,1代表出现


if( NULL == input || NULL == output )
rt = -1;
else
{
for( i=0; '\0' != *(input+i); i++ )
{
if( 0 == hashTable[*(input+i)] )
{
hashTable[*(input+i)] = 1;
*(output+j) = *(input+i);
j++;
}
}

*(output+j) = '\0';

}

#endif


//使用C++ STL中的关联容器Set更方便且更为强大,Set容器是键的集合

#if USINGSET
int rt = 0;
set<char> setChar;
int i = 0, j = 0;

if( NULL == input || NULL == output )
rt = -1;
else
{
//去重,但经过排序

for( i=0; '\0' != *(input+i); i++ )
{

if( 0 == setChar.count( *(input+i) ) )
{
*(output+j) = *(input+i);
j++;
}

setChar.insert( *(input+i) );

}

*(output+j) = '\0';
}

#endif
//方法二:

#if NOUSEHASHTABLE

int rt = 0, i = 0, j = 0, index = 0;
int flag = 0;// 用于标记是否当前字符在之前是否出现
int len = strlen( input );

if( NULL == input || NULL == output )
rt = -1;
else
{

for( i=0; i<len; i++ )//外层循环用于遍历源字符串
{

for( j=0; j<i; j++ )//内层循环用于查找当前字符是否在之前出现
{
if( *(input+i) == *(input+j) )
{
flag = 1;
break;
}
}
if( 1 == flag )
{
flag = 0;
continue;
}
else
{
*(output+index) = *(input+i);
index++;
}
}

*(output+index) = 0;
}
#endif

return rt;
}


运行结果:
删除字符串中的重复字符