转载:http://blog.youkuaiyun.com/vincent040/article/details/6902631
题目如题所示,将 “google” 弄成“gole”
// strip.c
#include <stdio.h>
#include <string.h>
#define REDUNDANT -1
void strip(char *str)
{
if(str == NULL)
return;
int i, j;
char *p = str;
// mark all redundant letters
for(i=1; str[i] != '\0'; i++)
{
for(j=0; j<i; j++)
{
if(p[j] == str[i])
{
str[i] = REDUNDANT;
break;
}
}
}
/*
** locate the first redundant letter and
** the first common letter after it.
*/
int redun = 0, common = 0;
for(i=1; str[i] != '\0'; i++)
{
if(str[i] != REDUNDANT)
continue;
redun = i;
while(str[i] == REDUNDANT)
i++;
common = i;
break;
}
// no repeat letter
if(redun == 0)
return;
/*
** move all common letters forward
*/
while(str[common] != '\0')
{
if(str[common] == REDUNDANT)
{
common++;
continue;
}
str[redun++] = str[common];
str[common++] = REDUNDANT;
}
str[redun] = '\0';
}
int main(void)
{
char buf[64];
fgets(buf, 64, stdin);
strip(buf);
printf("%s", buf);
return 0;
}
/*这个是我自己实现的,不过标记那部分,还是林老师的比较精辟点*/
#include <stdio.h>
#define FLAG -1
void strip(char *buf)
{
int i = 0;
int j = 0;
int temp = 0;
if (buf == NULL)
return;
/*标记重复字符*/
/*
for (i=0; buf[i] != '\0'; i++)
{
for (j=0; buf[j] != '\0'; j++)
{
if (i == j)
{
continue;
}
else
{
if ((buf[i] == buf[j]) && (buf[j] != FLAG))
{
buf[j] = FLAG;
}
}
}
}
*/
/*标记重复字符*/
for(i=1; buf[i] != '\0'; i++)
{
for(j=0; j<i; j++)
{
if(buf[j] == buf[i])
{
buf[i] = FLAG;
break;
}
}
}
/*找字符 --> 填坑*/
for (i=0; buf[i] != '\0'; i++)
{
/*找坑*/
if (buf[i] != FLAG)
{
continue;
}
/*保存现场*/
temp = i;
i++;
/*找字符*/
while (buf[i] == FLAG)
{
i++;
}
/*开始填坑*/
if (buf[i] != '\0')
{
buf[temp] = buf[i];
buf[i] = FLAG;
}
else /*提前退出填坑*/
{
buf[temp] = '\0';
return;
}
/*恢复现场*/
i = temp;
}
buf[temp+1] = '\0';
}
int main(void)
{
char buf[64] = {0};
fgets(buf, 64, stdin);
strip(buf);
printf("%s\n", buf);
return 0;
}