思路:利用字符串记录重复出现的字符,每次需要判断是否已记录到字符串中,否则追加到字符串尾。
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;
}
}
}

京公网安备 11010502036488号