构造结构体iChar,记录每个字符在串中的位置和第一次出现的位置
之后按照字符进行排序,再用双指针按要求打印即可
#include<stdio.h> #include<algorithm> using namespace std; struct iChar { char c; int pos; int first; }; bool sortByChar(iChar a,iChar b){//要按照在原本序列中第一次出现的顺序对所有字母进行排序 if(a.first==b.first){ return a.pos<b.pos; } else { return a.first<b.first; } } int first(char input[],int n,char search){ for(int i=0;i<=n;i++) if(input[i]==search) return i; return -1; } int main(){//习题3.7 华中科大 找位置 char input[100]; iChar data[100]; while(scanf("%s",input)!=EOF){ int n=0; for(;n<100 && input[n]!='\0';n++){ data[n].c = input[n]; data[n].pos = n; data[n].first = first(input,n,input[n]);//最差也就是到自己,所以不需要等遍历完再逐个建立first } sort(data,data+n,sortByChar); int i=0,j=0; while(i<n){//双指针步进,i是本字符的第一个,j是下一种字符的第一个 while(j<n && data[i].c==data[j].c) j++; if(i+1==j){//i对应的字母没有重复 i = j; } else { while(i<j){//有重复的字母,逐个输出 printf("%c:%d",data[i].c,data[i].pos); i++; if(i<j){ printf(","); } else { printf("\n"); } } } } } return 0; }