前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<cmath>
using namespace std;
/* 题意:求一段话中最常出现的单词及其次数,若有多个相同的单词满足情况,则输出字典序最小的 思路:根据题意可以看出需要建立起string与int型的映射,又考虑到字典序最小的排序,故 可以使用map<string,int>来存放每个单词出现的次数。 注意点: map的遍历、双指针分割获取每个单词 */
string str;
map<string,int> mp;
map<char,bool> flag;
int main(){
getline(cin,str);
int len=str.size(),cnt=-1;
for(int i=0;i<len;i++){//因为题意说大小写不敏感,故大写全部转为小写
if(str[i]>='A'&&str[i]<='Z')
str[i]+=32;
}
for(int i='a';i<='z';i++)flag[i]=true;
for(int i='0';i<='9';i++)flag[i]=true;
//基本模板双指针获取每个单词
for(int i=0,j;i<len;){
if(!flag[str[i]]){//遇到非a~z,0~9之间的字符,直接跳过,进入下一个字符
i++;
continue;
}
j=i+1;
while(j<len&&flag[str[j]])j++;
int num=j-i;
string temp=str.substr(i,num);
mp[temp]++;
i=j+1;
}
string maxStr;
//遍历map
for(auto it=mp.begin();it!=mp.end();it++){
if(it->second>cnt){
cnt=it->second;
maxStr=it->first;
}
}
cout<<maxStr<<" "<<mp[maxStr]<<endl;
return 0;
}