说话方式
1. 题目地址
https://www.acwing.com/problem/content/1559/
2. 题目解析
这道题主要就是给定一个字符串,求出字符串中出现次数最多的单词。
3. 题解
首先,来讲述一下这道题的思路:
1. 由于这道题中的字符串含有空格,因此我们不能用cin接收,而应该用getline函数来接收。
2. 接收完之后,我们应该抠出字符串当中的单词(使用双指针算法,具体思想可以参考之前的博客),将单词存储在哈希表当中,并记录次数。
3. 最后,遍历一遍哈希表,找出出现次数最多的单词即可。(还需要考虑题目中的字典序情况)
4. 代码
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
//将string进行哈希,并存储字符串的个数
unordered_map<string,int> h;
//判断字符是否为字母,数字。
bool check(int c){
if(c >= '0' && c <= '9') return true;
if(c >= 'A' && c <= 'Z') return true;
if(c >= 'a' && c <= 'z') return true;
return false;
}
//将大写字母转换成小写字母
char to_lower(int c){
if(c >= 'A' && c <= 'Z'){
return c + 32;
}
return c;
}
string str;
int main(){
getline(cin,str);
//抠出字符串中的单词,并存储在h表中
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 += to_lower(str[j++]);
}
h[word]++;
i = j;
}
}
int cnt = -1;
string word;
//遍历哈希表,得出答案
for(auto item : h){
string per_word = item.first;
int number = item.second;
//两个条件:1. 如果遍历的单词出现次数更大,更新。
// 2. 或者次数相等,遍历的单词字典序更小,更新。
if(cnt < number || cnt == number && word > per_word){
cnt = number;
word = per_word;
}
}
cout << word << " " << cnt << endl;
return 0;
}
标签:说话,哈希,方式,单词,这道题,&&,字符串,include
From: https://www.cnblogs.com/gao79135/p/17703368.html