Cool说丨819

简介: 819. 最常见的单词

819. 最常见的单词

给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。

禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。


示例:

输入:

paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."

banned = ["hit"]

输出: "ball"

解释:

"hit" 出现了3次,但它是一个禁用的单词。

"ball" 出现了2次 (同时没有其他单词出现2次),所以它是段落里出现次数最多的,且不在禁用列表中的单词。

注意,所有这些单词在段落里不区分大小写,标点符号需要忽略(即使是紧挨着单词也忽略, 比如 "ball,"),

"hit"不是最终的答案,虽然它出现次数更多,但它在禁用单词列表中。


说明:

  • 1 <= 段落长度 <= 1000.
  • 1 <= 禁用单词个数 <= 100.
  • 1 <= 禁用单词长度 <= 10.
  • 答案是唯一的, 且都是小写字母 (即使在 paragraph 里是大写的,即使是一些特定的名词,答案都是小写的。)
  • paragraph 只包含字母、空格和下列标点符号!?',;.
  • 不存在没有连字符或者带有连字符的单词。
  • 单词里只包含字母,不会出现省略号或者其他标点符号。

第一版,有的没考虑到

输入:"a, a, a, a, b,b,b,c, c" ["a"]

输出:"bbbc"

预期:"b"

stringmostCommonWord(stringparagraph, vector<string>&banned) {

   stringword;

   intlen=paragraph.size(),max=1;

   unordered_map<string, int>res;

   for (inti=0; i<len; ++i) {

       if (paragraph[i] >='A'&&paragraph[i] <='Z') word+=paragraph[i] +'a'-'A';

       elseif (paragraph[i] >='a'&&paragraph[i] <='z') word+=paragraph[i];

       elseif (paragraph[i] ==' ') {//空格

           if (find(banned.begin(), banned.end(), word) ==banned.end()) {

               res[word] +=1;

           }

           word="";

       }

   }

   for (auto&a : res) {

       if (max<=a.second) {

           max=a.second;

           word=a.first;

       }

   }

   returnword;

   }

第二版,其实不难,也可以再优化一点

执行用时 :8 ms, 在所有 cpp 提交中击败了78.04%的用户

内存消耗 :8.6 MB, 在所有 cpp 提交中击败了97.33%的用户

   stringmostCommonWord(stringparagraph, vector<string>&banned) {

   stringword;

   intlen=paragraph.size(),max=1;

   unordered_map<string, int>res;

   for (auto&p:paragraph) {

       if (p>='A'&&p<='Z') word+=p+'a'-'A';

       elseif (p>='a'&&p<='z') word+=p;

       elseif(word!="") // && paragraph[i]==' '|| paragraph[i] == '!' || paragraph[i] == '?' || paragraph[i] ==  '\''|| paragraph[i] == ',' || paragraph[i] == ':' || paragraph[i] == '.'

       {

           if (find(banned.begin(), banned.end(), word) ==banned.end()) {

               res[word] +=1;

           }

           word="";

       }

   

   }

   for (auto&a : res) {

       //cout << a.first << " " << a.second << endl;

       if (max<=a.second) {

           max=a.second;

           word=a.first;

       }

   }

   returnword;

   }

第三版,这个反而更快,有点不可思议。。。

执行用时 :4 ms, 在所有 cpp 提交中击败了98.99%的用户

内存消耗 :8.6 MB, 在所有 cpp 提交中击败了100.00%的用户

   stringmostCommonWord(stringparagraph, vector<string>&banned) {

   stringword;

   intlen=paragraph.size(),max=1;

   unordered_map<string, int>res;

   for (autop:paragraph) {

       if (p>='A'&&p<='Z') word+=p+'a'-'A';

       elseif (p>='a'&&p<='z') word+=p;

       elseif(word!="")

       {

           if (find(banned.begin(), banned.end(), word) ==banned.end()) {

               res[word] +=1;

           }

           word="";

       }

   

   }

   for (autoa : res) {

       if (max<=a.second) {

           max=a.second;

           word=a.first;

       }

   }

   returnword;

   }


目录
相关文章
|
C++ 测试技术 算法
蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
|
算法 Shell
通信系统中ZF,ML,MRC以及MMSE四种信号检测算法误码率matlab对比仿真
通信系统中ZF,ML,MRC以及MMSE四种信号检测算法误码率matlab对比仿真
|
存储 Prometheus Cloud Native
Grafana 系列文章(十):为什么应该使用 Loki
Grafana 系列文章(十):为什么应该使用 Loki
|
网络协议 网络性能优化 API
dpdk课程学习之练习笔记三(tcp的简单实现)
dpdk课程学习之练习笔记三(tcp的简单实现)
365 0
|
Prometheus Cloud Native API
|
缓存 运维 NoSQL
Redis 集群化部署实战:打造高可用、可扩展的缓存系统
本文详细介绍Redis集群化部署方案,涵盖架构设计、环境准备、配置优化、Docker部署、集群管理、监控运维及故障处理,助你构建高可用、可扩展的分布式缓存系统。
336 2
|
11月前
|
Web App开发 安全 Linux
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
VMware Workstation Pro 是由威睿(VMware)公司开发的一款功能强大的桌面虚拟化软件,允许用户在同一台物理计算机上同时运行多个操作系统,如Windows、..
1063 2
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
|
测试技术 程序员 C#
《黑神话:悟空》:从Unity到UE4 —— 游戏引擎迁移的挑战与机遇
【8月更文第26天】近年来,游戏行业的发展突飞猛进,特别是在图形表现力和技术实现上。《黑神话:悟空》是一款备受期待的动作角色扮演游戏,该游戏在早期开发阶段使用了Unity引擎,但为了追求更高的视觉质量和更强大的技术能力,开发团队决定将其迁移到Unreal Engine 4 (UE4)。本文将探讨这一迁移过程中的技术挑战与机遇。
1034 1
|
Ubuntu
树莓派 —— 关闭安装软件包时ubuntu对内核版本等的检查
树莓派 —— 关闭安装软件包时ubuntu对内核版本等的检查
|
运维 监控 Shell
自动化运维之宝:编写高效的Shell脚本
【8月更文挑战第31天】在运维的世界里,Shell脚本是一把瑞士军刀,它让日常任务变得简单而高效。本文将通过浅显易懂的语言和实际案例,带你领略Shell脚本的魅力,并教你如何打造属于自己的自动化工具箱。无论你是初学者还是资深运维,这篇文章都将为你打开一扇窗,让你看到不一样的风景。让我们一起探索Shell脚本的世界吧!

热门文章

最新文章