【题解】【AcWing】1557. 说话方式

1557. 说话方式

原题传送:AcWing 1557. 说话方式

不同的人对描述同一种事物的同义词的偏爱程度可能不同。

例如,在说警察时,有人喜欢用 the police,有人喜欢用 the cops

分析说话方式有助于确定说话者的身份,这在验证诸如和你线上聊天的是否是同一个人十分有用。

现在,给定一段从某人讲话中提取的文字,你能确定他的最常用词吗?

输入格式

输入共一行,包含一个字符串,以回车符 \n 终止。

输出格式

共一行,输出最常用词以及其出现次数。

如果常用词有多个,则输出字典序最小的那个单词。

注意,单词在输出时,必须全部小写。

单词是指由连续的字母和数字构成的,被非字母数字字符或行首/行尾分隔开的,连续序列。

单词不区分大小写。

数据范围

输入字符串长度不超过 1048576 1048576 1048576,且至少包含一个大小写字母或数字。

输入样例:

Can1: "Can a can can a can?  It can!"

输出样例:

can 5

思路

采用双指针, i i i 记录遍历句子的位置, j j j 记录单词中的位置,将每个单词存入哈希表,最后遍历哈希表取出词频最大并且字典序最小的单词及其词频。

题解

#include 
using namespace std;

int cnt = -1;
string s, res = "";
unordered_map<string, int> h;

int main()
{
     
	getline(cin, s);

	for(int i = 0; i < s.length(); i++)
	{
     
		if(isalnum(s[i]))
		{
     
			int j = i;
			string word = "";
			
			while(j < s.length() && isalnum(s[j]))
				word += tolower(s[j++]);
				
			h[word]++;
			i = j;
		}
	}
	
	for(auto i : h)
	{
     
		if(i.second > cnt || i.second == cnt && i.first < res)
		{
     
			res = i.first;
			cnt = i.second;
		}
	}

	cout << res << " " << cnt << endl;
	
	return 0;
}

你可能感兴趣的:(#,AcWing)