设计一个算法,在不使用额外存储空间的情况下,去掉字符串中重复的字符。(注:允许使用一个或者两个附件变量,但不能傻不拉几的把所有的字符复制一遍)
方法有很多,废话不多说,直接帖上代码。
#include <stdio.h>
#include <string.h>
/**
*技巧,但是要分配额外的ascii码表数组
*/
void rmdup1(char* str){
if(str==NULL)
return;
int len=strlen(str);
if(len<2)
return;
char flags[256];
memset(flags,0,sizeof(flags));
int i,j;
int index=1;
flags[str[0]]=1;
for(i=1;i<len;++i)
{
if(flags[str[i]]!=1)
{
str[index++]=str[i];
/**
*到目前为止,str[0..index]都是唯一不重复的
*/
flags[str[i]]=1;
}
}
str[index]='\0';
}
/**
* 暴力,每遇到一个相同的字符,都移动后面的字符串
*/
void rmdup2(char* str){
if(str==NULL)
return;
int len=strlen(str);
if(len<2)
return;
int i,j,k;
for(i=0; i < len; ++i)
{
for(j=i+1; j<len; ++j)
{
if(str[i]==str[j])
{
//遇到相同字符时,将后面的字符向前移动
for(k=j+1;k<len;++k)
str[k-1]=str[k];
//新的字符串
str[len-1]='\0';
len--;
j--;//移动后该位置的已经发生该表,重新比较该位置的值
}
}
}
}
/**
*比较法,将相同的字符位置置0
*/
void rmdup3(char* str){
if(str==NULL)
return;
int len=strlen(str);
if(len<2)
return;
int i,j;
int index=0;
for(i=0;i<len;++i)
{
if(str[i]!='\0')
{
str[index++]=str[i];
/**
*到目前为止,str[0..index]都是唯一不重复的
*/
for(j=i+1;j<len;++j)
{
if(str[j]==str[i])
str[j]='\0';
}
}
}
str[index]='\0';
}
/**
*比较法,改进版
*/
void rmdup4(char *str)
{
if (str == NULL)
return;
int len = strlen(str);
if (len < 2)
return;
int tail = 1;
int i;
for (i = 1; i < len; ++i)
{
int j;
for (j = 0; j < tail; ++j)
{
if (str[i] == str[j])
break;
}
if (j == tail)
{
str[tail] = str[i];
/**
*到目前为止,str[0...tail]是唯一不重复的
*/
++tail;
}
}
str[tail] = 0;
}
int main(int argc,char ** argv)
{
char str[32]="aabbcccddddfffeedddd";
printf("remove duplicate before:%s\n",str);
rmdup4(str);
printf("remove duplicate after:%s\n",str);
return 0;
}