题目描述
不同的人对描述同一种事物的同义词的偏爱程度可能不同。
例如,在说警察时,有人喜欢用 the police,有人喜欢用 the cops。
分析说话方式有助于确定说话者的身份,这在验证诸如和你线上聊天的是否是同一个人十分有用。
现在,给定一段从某人讲话中提取的文字,你能确定他的最常用词吗?
输出格式
共一行,输出最常用词以及其出现次数。
如果常用词有多个,则输出字典序最小的那个单词。
注意,单词在输出时,必须全部小写。
单词是指由连续的字母和数字构成的,被非字母数字字符或行首/行尾分隔开的,连续序列。
单词不区分大小写。
样例
输入样例:
Can1: "Can a can can a can? It can!"
输出样例:
can 5
算法1
双指针算法:
输出出现频率最高的单词 不区分大小写 都当成小写字母来判断
①读入一整行,getline(cin,str)
②提取字符串中的每个单词
类似双指针算法
for(i=0;i<str.size();i)//外重循环遍历整个字符串
if 如果是字母或数字,则是整个单词的第一个字母//非单词部分,可以直接忽略,考虑所有是字母部分的字符
//把整个单词找出来
j=i;
while(j<str.size() && ) 只要j在范围内并且第j个字符也是字母或数字
j;
i=j; 因为最后i要加加
循环结束后,i到j之间是完整的单词
C++ 代码
#include<bits/stdc++.h>
using namespace std;
bool check(char c)
{
if(c>='0'&&c<='9')return true;
if(c>='a'&& c<='z')return true;
if(c>='A'&&c<='Z')return true;
return false;
}
int main()
{
string s;
getline(cin,s);
map<string,int> hash;
for(int i=0;i<s.size();i++)
if(check(s[i]))
{
string word;
int j=i;
while(j<s.size() && check(s[j]))
word+=tolower(s[j++]);
hash[word]++;
i=j;
}
string res;
int cnt=0;
for(auto it:hash)
if(it.second>cnt )
{
res=it.first;
cnt=it.second;
}
cout<<res<<" "<<cnt<<endl;
return 0;
}
算法2
- ⼤⼩写不区分,所以统计之前要先s[i] = tolower(s[i]);
- [0-9 A-Z a-z]可以简写为cctype头⽂件⾥⾯的⼀个函数isalnum~~
- 必须⽤getline读⼊⼀⻓串的带空格的字符串~~
- ⼀定要当word不为空的时候hash[word]++,因为word为空也会被统计的!!!~~
- 最重要的是~如果i已经到了最后⼀位,不管当前位是不是字⺟数字,都得将当前这个word放到hash
⾥⾯(只要word⻓度不为0)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
bool check(char c)
{
if(c>='0'&&c<='9')return true;
if(c>='a'&& c<='z')return true;
if(c>='A'&&c<='Z')return true;
return false;
}
int main()
{
string s;
getline(cin,s);
map<string,int> hash;
string word;
for(int i=0;i<s.size();i++)
{
if(check(s[i]))
{
word+=tolower(s[i]);
}
if(!check(s[i]) || i==s.size()-1)
{
if(word.size()!=0) hash[word]++;
word="";
}
}
int cnt=0;
for(auto it:hash)
{
if(it.second>cnt )
{
word=it.first;
cnt=it.second;
}
}
cout<<word<<" "<<cnt<<endl;
return 0;
}