思路:利用字符串记录重复出现的字符,每次需要判断是否已记录到字符串中,否则追加到字符串尾。

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;
        }
    }
}