描述
不同的人对描述同一种事物的同义词的偏爱程度可能不同。
例如,在说警察时,有人喜欢用 the police,有人喜欢用 the cops。
分析说话方式有助于确定说话者的身份,这在验证诸如和你线上聊天的是否是同一个人十分有用。
现在,给定一段从某人讲话中提取的文字,你能确定他的最常用词吗?
输入格式
输入共一行,包含一个字符串,以回车符 \n 终止。
输出格式
共一行,输出最常用词以及其出现次数。
如果常用词有多个,则输出字典序最小的那个单词。
注意,单词在输出时,必须全部小写。
单词是指由连续的字母和数字构成的,被非字母数字字符或行首/ 行尾分隔开的,连续序列。
单词不区分大小写。
数据范围
输入字符串长度不超过 1048576 ,且至少包含一个大小写字母或数字。
输入样例:
Can1: "Can a can can a can? It can!"
输出样例:
can 5
思路
忽略大小写,记录下每个单词出现的次数,最后比较输出即可。 如何判断是否是一个单词:找到第一个数字或字母,一直向后找,遇到非数字且非字母时候停止。在寻找过程中可以将当前字母加到word中(也可以最后利用substring()
)
AC代码
#include <bits/stdc++.h>
using namespace std;
bool check ( char c)
{
if ( isdigit ( c) || isalpha ( c) ) return true ;
return false ;
}
int main ( )
{
string str;
getline ( cin, str) ;
unordered_map< string, int > hash;
for ( int i = 0 ; i < str. size ( ) ; i ++ )
if ( check ( str[ i] ) )
{
string word;
int j = i;
while ( j < str. size ( ) && check ( str[ j] ) ) word + = tolower ( str[ j ++ ] ) ;
hash[ word] ++ ;
i = j;
}
string ans;
int cnt = - 1 ;
for ( auto t : hash)
{
if ( t. second > cnt || t. second == cnt && t. first < ans)
{
cnt = t. second;
ans = t. first;
}
}
cout << ans << ' ' << cnt;
return 0 ;
}