题目描述
大小写字母+数字的组合才是合法的单词
输入一字符串,统计出现次数最多的合法单词。如果有并列的,那么输出字典序里面的第一个
思路
- 使用isalnum测试字符是否为英文(alpha character)或数字(numeric character)
- 使用tolower将大写字母转换成小写字母
- 注意string字符串拼接使用的是+
- 当遇到英文和数字以外的字符,说明之前已经构成了一个单词,需要将单词temp加入map中,但注意一定要当temp不为空的时候m[temp]++,因为temp为空也会被统计的
- 如果i已经到了最后一位,不管当前位是不是字母数字,都得将当前这个temp放到map里面
- 由于map默认按照key值从小到大排序,因此使用map<string,int>存储,按value值从大到小排序,当value值相等时,可以做到输出字典序里面的第一个
#include <bits/stdc++.h>
using namespace std;
map<string,int>m;
typedef pair<string,int>PAIR;
int cmp(PAIR a,PAIR b)
{
return a.second>b.second;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string s,temp;
getline(cin,s);
int len=(int)s.length();
for(int i=0;i<len;i++)
{
if(isalnum(s[i]))
{
s[i]=tolower(s[i]);
temp+=s[i];
}
if(!isalnum(s[i])||i==len-1)
{
if(temp.length()!=0)
m[temp]++;
temp.clear();//清空
}
}
vector<PAIR>vec(m.begin(),m.end());
sort(vec.begin(),vec.end(),cmp);
cout<<vec[0].first<<" "<<vec[0].second;
return 0;
}
思考:若在出现次数相同的情况下,按字典序倒序输出,将cmp改成以下
int cmp(PAIR a,PAIR b)
{
if(a.second!=b.second)
return a.second>b.second;
else return a.first<b.first;
}