题目连接在此。
题意
“单词”的定义为大小写字母、数字的组合。给出一行字符串,求出出现次数最多的单词及其出现次数(一切除了大小写字母、数字之外的字符都作为单词的分隔符)。字母不区分大小写,且最后结果输出小写形式。
思路
1. 用一个map<string,int>
变量tbl
存放每个单词出现的次数。
2. 在读入输入的字符串input
后,对input
进行枚举处理,如果是有效字符,则对应字符的出现次数+1;如果是无效字符,则跳过。
3. 最后对tbl
进行遍历,找出出现次数最多的单词及出现次数。
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
map<string,int> tbl;
bool isWord(char c){
if(c >= '0' && c <= '9') return true;
if(c >= 'a' && c <= 'z') return true;
if(c >= 'A' && c <= 'Z') return true;
return false;
}
int main(){
string input;
getline(cin, input);
string temp = "";
// transform(input.begin(), input.end(),input.begin(), ::tolower); //将输入字符串全都转换成小写
input += " ";
for(string::iterator it = input.begin(); it != input.end(); it++){
if(isWord(*it)){ //如果是数字和字母
if(*it >= 'A' && *it <= 'Z'){ //如果为大侠字母
*it += 32; //转换为小写字母
}
temp += *it; //将*it接上temp之后
} else{
if(temp.length() != 0){ //如果temp不为空
tbl[temp]++; //temp出现次数+1
temp.clear(); //置空temp
}
}
}
int count = 0;
string res = "";
for(map<string, int>::iterator it = tbl.begin(); it != tbl.end(); it++){
if(it->second > count){
count = it->second;
res = it->first;
}
}
cout << res << " " << count;
return 0;
}
注意点: 以上代码的在输入字符串input
之后添加一个空格,是为了处理出现以有效字符结尾的字符串的情况,如以下两种:
can
can can