题解 | #找位置# 利用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;
        }
    }
}

全部评论

相关推荐

这不纯纯作弊了吗😢😢😢
编程界菜鸡:信这个的这辈子有了,这智商你靠啥都没用
你找工作的时候用AI吗?
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务