PAT甲级真题1071 Speech Patterns 【 字符串处理 】题解

绝地灬酷狼 2021-07-24 22:25 417阅读 0赞

目录

      • 1.题目
      • 2.代码

1.题目

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

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

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

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

输入格式
输入共一行,包含一个字符串,以回车符 \n 终止。
输出格式
共一行,输出最常用词以及其出现次数。

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

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

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

单词不区分大小写。
数据范围
输入字符串长度不超过 1048576,且至少包含一个大小写字母或数字。
输入样例:
Can1: "Can a can can a can? It can!"
输出样例:
can 5

2.代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<unordered_map>
  6. using namespace std;
  7. bool check(char c) //检验字符的合法性
  8. {
  9. if(c>='0'&&c<='9') return true;
  10. if(c>='a'&&c<='z') return true;
  11. if(c>='A'&&c<='Z') return true;
  12. return false;
  13. }
  14. char to_lower(char c) //大写的字符转换成小写的
  15. {
  16. if (c>='A'&&c<='Z') c+=32;
  17. return c;
  18. }
  19. int main()
  20. {
  21. string str;
  22. getline(cin,str); //读取一行
  23. unordered_map<string,int>hash; //建立映射
  24. for(int i=0;i<str.size();i++)
  25. {
  26. int j=i; //双指针算法
  27. if(check(str[i]))
  28. {
  29. string word;
  30. while(j<str.size()&&check(str[j]))
  31. {
  32. word+=to_lower(str[j]);
  33. j++;
  34. }
  35. i=j;
  36. hash[word]++;
  37. }
  38. }
  39. string word;
  40. int cnt=-1;
  41. for(auto c: hash)
  42. {
  43. if(c.second>cnt||c.second==cnt&&c.first<word)
  44. {
  45. word=c.first;
  46. cnt=c.second;
  47. }
  48. }
  49. cout<<word<<' '<<cnt<<endl;
  50. return 0;
  51. }

发表评论

表情:
评论列表 (有 0 条评论,417人围观)

还没有评论,来说两句吧...

相关阅读