/* 本例按字符出现顺序输出,时间复杂度O(n),空间O(n) 1、一共256个字符,申请长度为256的字符列表charInfos[256],charInfos[c]中记录字符c的数量和位置。 2、申请一个字符数组chars,按顺序记录出现的字符,num为其长度。 3、输入:略 4、输出:字符数组chars,如果字符chars[i]出现的次数charInfos[chars[i]].count大于1,即可输出该字符和它的位置。 */ #include <iostream> #include <string> #include <vector> using namespace std; struct CharInfo { int count = 0; vector<int> positions; }; int main() { string input; while (getline(cin, input)) { CharInfo charInfos[256]; // ASCII 码表大小 int num = 0; // 不同字符的数量 int chars[100]; // 用于存储这些字符, for (int i = 0; i < input.length(); ++i) { unsigned int c = input[i]; if (charInfos[c].count == 0) chars[num++] = c; charInfos[c].count++; charInfos[c].positions.push_back(i); } for (int i=0; i<num; ++i) { int c = chars[i]; // 字符 int n = charInfos[c].positions.size(); // 字符的数量 if(n==1) continue; for(int j=0; j<n; j++){ cout<<char(c)<<":"<<charInfos[c].positions[j]; if(j!=n-1) cout<<","; } cout<<endl; } } return 0; }