7-13 刪除重復字符 (20分)
本題要求編寫程序,將給定字符串去掉重復的字符后,按照字符ASCII碼順序從小到大排序后輸出。
輸入格式:
輸入是一個以回車結束的非空字符串(少於80個字符)。
輸出格式:
輸出去重排序后的結果字符串。
輸入樣例:
ad2f3adjfeainzzzv
輸出樣例:
23adefijnvz
第一種辦法:雖然我利用了占坑前移的想法,但是算法還是O(n^2)的 ,不好,可以利用標志變量把它簡化為o(n)(指的是不把快排包括在內),
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int cmp(const void *a,const void *b) 5 { 6 return *(char *)a-*(char *)b; 7 } 8 int main() 9 { 10 int i,j; 11 char a[100]; 12 gets(a); 13 int str=strlen(a); 14 int count; 15 for(i=0;a[i]!='\0';i++) 16 { 17 count=0; 18 for(j=i+1;a[j]!='\0';j++) 19 { 20 if(a[j]!=a[i]) 21 a[j-count]=a[j]; 22 else 23 count++; 24 } 25 str-=count; 26 a[str]='\0'; 27 } 28 29 qsort(a,str,sizeof(a[0]),cmp); 30 for(i=0;i<str;i++) 31 printf("%c",a[i]); 32 printf("\n"); 33 34 35 return 0; 36 }
第二種辦法
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(char *)a-*(char *)b; } int main() { int i,j; char a[100]; int hash[128]={0}; gets(a); int str=strlen(a); int count=0; for(i=0;a[i]!='\0';i++) { if(hash[a[i]]!=0) //說明前面出現過,可以作為坑,給其他人填了 count++; else { a[i-count]=a[i]; hash[a[i]]=1; } } str=str-count; a[str]=0; qsort(a,str,sizeof(a[0]),cmp); printf("%s\n",a); return 0; }