题解 | #找位置# 利用map对字符和链表的映射

找位置

https://www.nowcoder.com/practice/e3b2cc44aa9b4851bdca89dd79c53150

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

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

全部评论

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
头像
11-07 01:12
重庆大学 Java
精致的小松鼠人狠话不多:签哪了哥
点赞 评论 收藏
分享
孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务