【字符】删除重复字符
输入一个长度不超过 100 的字符串,删除串中的重复字符。
输入:
输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。
输出:
删除重复字符后的字符串。例如:abced。
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | abacaeedabcdcd↵ | abced↵ | 0 |
2 | 111122233344455577yuyuyu↵ | 123457yu↵ | 0 |
3 | 11111111111111↵ | 1↵ | 0 |
思路
我首先想到的是,对该字符串使用双重循环进行遍历,如果发现有重复的字符,就把该字符置为’\0’,最后再把这个字符数组中所有的’\0’去掉,此时得到的字符串就是删除重复字符后的目标字符串。
代码
#include <stdio.h>
#include <string.h>
main() {
char a[100];
scanf("%s",a) ;
int length=strlen(a);
int i,j;
for(i=0;i<length;i++)
{
for(j=i+1;j<length;j++)
{
if(a[i]==a[j])
{
a[j] = '\0';
}
}
if(a[i]!='\0')
printf("%c",a[i]);
}
printf("\n");
return 0;
}
课外思考
这样写确实可以,但毕竟用了双循环,时间复杂度是O(N2),同学们呢可以想一想能不能用空间换时间呢?
淡然是可以哒!!!
只需要用一个数组存储出现过的字符就可以啦,因为自负最多只有256个(实际上只有一百多个)
#include <stdio.h>
char mark[300],x;
int main()
{
while((x = getchar()) != '\n')
{
if(!mark[x])
{
putchar(x);
mark[x]++;
}
}
puts("");
}
写成一行就是
#include <stdio.h>
char mark[300],x;
int main()
{
do if(!mark[(x = getchar())]++) putchar(x);while(x != '\n');
}