删除字符串中的重复字符

删除字符串中的重复字符

实现函数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;
}


运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值