构造结构体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;
}

京公网安备 11010502036488号