题目描述
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。
输入描述:
输入有若干行,总计不超过1000个字符。
输出描述:
输出格式参见样例。
示例1
输入
A blockhouse is a small castle that has four openings through which to shoot.
输出
a:2 blockhouse:1 castle:1 four:1 has:1 is:1 openings:1 shoot:1 small:1 that:1 through:1 to:1 which:1
#include <iostream>
#include <map>
#include <string>
using namespace std;
string convert(string s) {
string res = "";
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
s[i] = s[i]+32;
}
res += s[i];
}
return res;
}
bool isSplit(char ch) {
if (ch == ',' || ch == '.' || ch == ' ') {
return true;
}
return false;
}
void wordNumber(string s) {
string temp = "";
map<string, int> wordMap;
for (int i = 0; i < s.length(); i++) {
if (!isSplit(s[i])) {
temp += s[i];
} else {
if (temp == "") {
continue;
}
//若是一个分隔符,查找temp是否已经在map中,若在map中则将value值加1,否则添加一个key值
//此处表示没有找到key为temp的map
if (wordMap.find(temp) == wordMap.end()) {
wordMap[temp] = 1;
} else {
int value = wordMap[temp];
value++;
wordMap[temp] = value;
}
temp = "";
}
}
map<string, int>::iterator iter;
for (iter = wordMap.begin(); iter != wordMap.end(); iter++) {
cout << iter->first << ":" << iter->second << endl;
}
}
int main(int n) {
string s1;
getline(cin, s1);
string s = convert(s1);
wordNumber(s);
return 0;
}