统计单词数
时间限制: 1Sec 内存限制: 128MB 提交: 464 解决: 188
题目描述
统计输入英文文章段落中不同单词(单词有大小写之分, 但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过100,最长单词的长度不超过20个字母.
输入
一个包含若干句子的段落, 每个句子由若干英文单词组成. 除空格, 逗号和句号外, 这些输入的句子中不含其他非字母字符, 并且, 逗号和句号紧跟在它前面的英文单词后面, 中间没有空格. 段落最后一个字符是回车符, 表示输入结束.
输出
若段落中共有M个不同的英文单词,则按照其在段落中出现的先后顺序输出M行,各行的格式为: 单词中所有字母均用大写形式输出(最长的单词顶格输出,它前面没有多余的空格; 其余单词与其右对齐) 冒号 N个*号 该单词在段落中的出现次数N
样例输入
代码语言:javascript复制This is a test. This test is easy. This is a test. This test is easy.
样例输出
代码语言:javascript复制THIS:****4
IS:****4
A:**2
TEST:****4
EASY:**2
题解:感觉很简单地一个题,让自己写的乱七八糟的,保证好单词的顺序以及判断单词个数就可以。
这里我设置了一个 f 来确保没有空格(感觉很憨)。然后用 map 来存一下,之前一直想错问题,还改成了 unordered 的。
代码语言:javascript复制#include <iostream>
#include<bits/stdc .h>
using namespace std;
char s[50000];
string ss[5000];
int main()
{
gets(s);
// printf("%s",s);
unordered_map<string,int>mp;
mp.clear();
int len = strlen(s);
string st = "";
int maxlen = 0;
int f = 0;
int top = 0;
for(int i = 0; i < len; i )
{
if(s[i] >='a' && s[i]<='z')
{
s[i] = s[i] -'a' 'A';
}
if(s[i] >= 'A' && s[i] <= 'Z' && f == 0)
{
st = s[i];
f = 1;
}
else if(s[i] >= 'A' && s[i] <= 'Z' && f == 1)
{
st = s[i];
}
else if(f == 1)
{
mp[st] ;
// cout << st <<" ---"<<mp[st] <<endl;
int tlen = st.length();
f = 0;
maxlen = max(tlen,maxlen);
if(mp[st] == 1) ss[top ]= st;
st = "";
}
}
unordered_map<string,int> :: iterator it;
for (int i = 0; i < top; i )
{
int tlen = ss[i].length();
int x = maxlen - tlen;
while(x--)
{
printf(" ");
}
cout << ss[i] << ":";
int ii = 0;
while(ii < mp[ss[i]])
{
printf("*");
ii ;
}
cout << mp[ss[i]] <<endl;
}
return 0;
}