解题思路:创建一个拥有String和int类型的结构体(node)存储其单词和出现的次数,用istringstream将句子按空格分割化成单词存储在vector中,利用STL函数std::transform以及string::erase将字母转换为大写并且去掉标点符号。

#include<bits/stdc++.h>
using namespace std;
/*用vector模拟unordered_map*/
struct Node {
    string str;
    int time=1;
    Node(string s) {//构造函数
        str = s;
    };
};
int main()
{
    vector<Node>vec;
    string str;
    getline(cin, str);
    istringstream is(str);//用istringstream讲句子按找空格变为一个个单词
    string s;
    int flag = 0;//标记是否已经存在在vector中的单词
    int i = 0;
    int max_len = 0;//最长长度,输出时让单词都在一边
    while (is >> s)
    {
        if (s.find('.') != -1)s.erase(s.find('.'), 1);
        else if (s.find(',') != -1)s.erase(s.find(','), 1);
        transform(s.begin(), s.end(), s.begin(), ::toupper);//这三句将单词变为大写并去掉标点符号
        if (s.length() > max_len)max_len = s.length();//找到最长的单词长度
        Node *n = new Node(s);
        for (i=0;i<vec.size();i++)
        {
            if (n->str == vec[i].str) {
                flag = 1; break;//找到相同节点的下标,所以break
            }
        }
        if (flag == 0)
            vec.push_back(*n);//将单词放入vec,vector中没有相同时假如一个单词,有的时候使node的time+1
        else { vec[i].time++; flag = 0; }
    }
    for (i=0;i<vec.size();i++)//按格式输出
    {
        cout << setw(max_len) << vec[i].str << ":";
        for (int j = 0; j <vec[i].time; j++)
        {
            cout << '*';
        }
        cout <<vec[i].time << endl;
    }
    return 0;
}

解题思路2:利用unodered_map及vector容器,这次写了split函数用来拆分句子并直接放入vector

#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <unordered_map>
#pragma comment(linker,"/STACK:10240000,10240000") //手动加栈
using namespace std;
vector<string>  split(const string& str, const string& delim) { //将分割后的子字符串存储在vector中
    vector<string> res;
    if ("" == str) return  res;
    string strs = str + delim; //*****扩展字符串以方便检索最后一个分隔出的字符串
    size_t pos;
    size_t size = strs.size();
    for (int i = 0; i < size; ++i) {
        pos = strs.find(delim, i); //pos为分隔符第一次出现的位置,从i到pos之前的字符串是分隔出来的字符串
        if (pos < size) { //如果查找到,如果没有查找到分隔符,pos为string::npos
            string s = strs.substr(i, pos - i);//*****从i开始长度为pos-i的子字符串
            if(!s.empty())
            res.push_back(s);//两个连续空格之间切割出的字符串为空字符串,这里没有判断s是否为空,所以最后的结果中有空字符的输出,
            i = pos + delim.size() - 1;
        }
    }
    return res;
}
int main()
{
unordered_map<string, int> m;//定义unordered_map
    string str; int n;
    string s;
    getline(cin, s);
    std::vector<string> sa=split(s," ");//将s拆分
    int max_len = 0;//获取最长长度,输出要用
    for (vector<string>::iterator iter = sa.begin(); iter != sa.end(); iter++)
    {
        if (iter->find('.') != -1)iter->erase(iter->find('.'), 1);
        else if (iter->find(',') != -1)iter->erase(iter->find(','), 1);
        string t = *iter;//map中的string键值
        transform(t.begin(), t.end(), t.begin(), ::toupper);
        /*cout << *iter<<endl;*/
        m[t]++;//每次出现让其int类型的数据+1
        if (t.length() > max_len)max_len = t.length();
    }
    for (unordered_map<string, int>::iterator it = m.begin(); it != m.end(); it++)
    {
        //按题目要求格式输出
        cout <<setw(max_len)<< it->first << ":";
        for (int i = 0; i < it->second; i++)
        {
            cout << '*';
        }
        cout <<it->second<< endl;
    }
    return 0;
}

第一次冲进全站前十,加油!!!

NICE