思路:利用字符串记录重复出现的字符,每次需要判断是否已记录到字符串中,否则追加到字符串尾。
map是字符和链表的映射,链表存放字符出现的下标位置,最后输出链表长度大于1的下标。
#include "iostream" #include "map" #include "vector" #include "string" using namespace std; int main(){ string str; cin >> str; map<char, vector<int>> strMap; string repeat_str = ""; // 记录有重复的字符 for(int i=0;i<str.size();++i){ if(strMap.find(str[i]) != strMap.end()){ // strMap中未记录当前字符 int pos = repeat_str.find(str[i]); if(pos == string::npos){ // 查询重复的字符串在repeat_str是否出现 repeat_str.push_back(str[i]); // 将重复的字符串追加到repeat_str中 } strMap[str[i]].push_back(i); // 将下标追加到容器中 } else{ int pos = repeat_str.find(str[i]); if(pos == string::npos){ // 查询重复的字符串在repeat_str是否出现 repeat_str.push_back(str[i]); // 将重复的字符串追加到repeat_str中 } strMap[str[i]].push_back(i); } } for(int i=0;i<repeat_str.size();++i){ int len = strMap[repeat_str[i]].size(); if(len > 1){ vector<int>::iterator it=strMap[repeat_str[i]].begin(); cout << repeat_str[i] << ":" << *it; it++; for(it;it!=strMap[repeat_str[i]].end();++it){ cout << "," << repeat_str[i] << ":" << *it; } cout << endl; } } }