今天是元宵节,力扣也细心地为我们准备了一道有关节日的题,一起看看吧:
1178. 猜字谜
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。
字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:
1. 单词 word 中包含谜面 puzzle 的第一个字母。
2. 单词 word 中的每一个字母都可以在谜面 puzzle 中找到。

例如,如果字谜的谜面是 “abcdefg”,那么可以作为谜底的单词有 “faced”, “cabbage”, 和 “baggage”;而 “beefed”(不含字母 “a”)以及 “based”(其中的 “s” 没有出现在谜面中)。
返回一个答案数组 answer,数组中的每个元素 answer[i] 是在给出的单词列表 words 中可以作为字谜迷面 puzzles[i] 所对应的谜底的单词数目。

示例:

输入: words = [“aaaa”,“asas”,“able”,“ability”,“actt”,“actor”,“access”],
puzzles =[“aboveyz”,“abrodyz”,“abslute”,“absoryz”,“actresz”,“gaswxyz”]
输出:[1,1,3,2,4,0]
解释:
1 个单词可以作为 “aboveyz” 的谜底 : “aaaa”
1 个单词可以作为"abrodyz" 的谜底 : “aaaa”
3 个单词可以作为 “abslute” 的谜底 : “aaaa”, “asas”,“able”
2 个单词可以作为 “absoryz” 的谜底 : “aaaa”, “asas”
4 个单词可以作为 "actresz"的谜底 : “aaaa”, “asas”, “actt”, “access”
没有单词可以作为 "gaswxyz"的谜底,因为列表中的单词都不含字母 ‘g’。

提示:
1 <= words.length <= 10^5
4 <= words[i].length <= 50
1 <= puzzles.length <= 10^4
puzzles[i].length == 7
words[i][j], puzzles[i][j] 都是小写英文字母。
每个 puzzles[i] 所包含的字符都不重复。

力扣原题传送

暴力求解:
直接暴力求解:遍历每一个谜面都去words遍历寻找解,很显然我们需要遍历一次puzzles数组,N * M 次words数组,以及对words中字符串的扫描N次(N为puzzles数组长度,M为words数组长度)
时间复杂度过高,不可取!

另寻捷径:
题中只是要求字谜中的所有字母出现在谜面中,对顺序无要求,因此可以使用哈希表 (unordered_map) 存储words所有字符串的信息,这里可以巧妙使用位图的思想:将26个英文字母(题中注明了均为小写)用26位(bit)进行表示,如果字母c存在,那么第(c-‘a’) + 1位就置为1(一个int类型数据为32位),例如:
"abc"用二进制数表示为 111
"ebc"表示为 10011
"zab"表示为 1000…011 (共32位)

words中的每一个字符串都可以用一个这样的数进行表示,二进制数可以通过移位操作得来。

  1. 这道题只会出现小写字母,种类最多是26种,而且单词的字符只要在puzzle里出现了就行。即对每个字符来说,就2种状态:出现与否,可以用 0/1 来表示这种相对的状态。

  2. 出现过的字符记为1,否则为0,比如 abc:111,aacc:101,zab:1000…0011(26位)

  3. 遍历单词数组,求出单词对应的二进制数,存入map,统计对应的次数,因为有些单词对应同一个二进制数,比如 abc 和 aaabbc 都是 111。

  4. 单词要成为 puzzle 的谜底,必须包含 puzzle 的首字符,我们找出所有包含 puzzle 首字母的 puzzle 字母组合。比如 aboveyz 有:a,ab,ao,av,ae,ay,az,abo,abv,abe……这些组合都对应有二进制数。

  5. 而每个单词也对应一个二进制数,如果在其中,则这个单词就是 puzzle 的谜底。所以,对于 puzzle 的这些二进制数,即它的组合,我们去查看 map 中是否有对应的值 c,如果有,说明有 c 个单词是这样的字母组合,是这个 puzzle 的谜底。把当前 puzzle 所有的组合在 map 中对应的值累加起来,就是当前 puzzle 的谜底单词个数。

class Solution {public:vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {//利用位图的思想,若某一个字母出现过,那么这一位被标记为1unordered_map<int, int> hash;//key值存放位图信息,value对应是出现的次数for (string& str : words) {int count = 0;for (char& ch : str) {count |= 1 << (ch - 'a');}hash[count]++;//哈希记录出现的这个数}int n = puzzles.size();vector<int> res(puzzles.size(), 0);for (int i = 0; i < n; i++) {int puzzle_num = 0;//记录谜面位图信息string& puzz = puzzles[i];for (char& ch : puzz) {puzzle_num |= (1 << (ch - 'a'));}//得到谜面的位图信息对应的数int sub = puzzle_num;int count = 0;do {//得到每一个谜面的所有组合,在哈希表中寻找满足条件的words并累加起来sub = (sub - 1) & puzzle_num;if ((1 << (puzz[0] - 'a')) & sub)res[i] += hash[sub];} while (sub != puzzle_num);}return res;}
};

猜字谜 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:相关推荐

  1. Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现

    Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 CompoundBigWatermel ...

  2. [SFML]使用SFML复刻一个九宫幻卡小游戏(一)前期规划和准备工作

    写在前面:   是笔者大二下的课内作业,要求是使用SFML制作棋牌类游戏.本人水平较差,复刻开发过程中存在大量走弯路.走邪门.代码冗余等情况.写此博客记录已经是一年以后的复盘了,仅作为个人学习的记录. ...

  3. 如何设计适合幼儿园阶段的英语小游戏(内有示例)

    幼儿园英语教学游戏化重要性较为显著,有助于从整体上调动学生的学习动机.在实际的教学环节中要充分结合幼儿园身心发展的实际特点,将单词教学.听力教学以及语音教学有效的结合在一起,突出幼儿在英语教学中的主体 ...

  4. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  5. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  6. 基于C++控制台(Windows平台)的一个吃豆人小游戏

    PacManX --南京大学2019秋季学期 "高级程序设计 "课程设计一 基于C++控制台(Windows平台)的一个吃豆人小游戏 已实现的目标: 地图支持自定义编辑(可编辑地图 ...

  7. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  8. 仿照贪吃蛇大作战的原型做的小游戏

    仿照贪吃蛇大作战的原型做的小游戏,通过摇杆移动小蛇,吃掉食物可以增加身体的长度.有加速功能,还有不太智能的AI电脑. 文件:590m.com/f/25127180-493401547-1ed8d3(访 ...

  9. 【六一特别文章】Python编写一个六一儿童节问答小游戏及趣味比赛

    随着六一儿童节的到来,我们可以为孩子们编写一个有趣的小游戏,让他们在游戏中学习有关六一儿童节的知识.本文将介绍如何用Python编写一个六一儿童节问答小游戏及趣味比赛. 首先,我们需要准备一些有关六一 ...

最新文章

  1. 张正友相机标定代码(c++python)
  2. 图论:Dinic算法
  3. MySQL创建触发器(CREATE TRIGGER)
  4. 种草之火,何以燎原?
  5. hyperf自定义注解类_swoole学习六hyperf注解的使用
  6. [HTML5]3D标签云
  7. Java与.Net 在RSA加密方面能不能互相通讯操作???
  8. idea maven工程显示灰色(不亮)
  9. java 容器类 面试_校招面试之Java容器
  10. Python编写九九乘法表代码以及解决方案
  11. 练习华为大型公司网络构建拓扑图
  12. teraterm linux环境,linux ssh telnet TeraTerm终端中文显示乱码解决方法
  13. OpenAI Whisper中文语音识别效果尝试和应用(一)
  14. linux shell 切换目录,如何在Shell中快速切换目录?
  15. 已知鸡兔的脚一共80只C语言,鸡兔同笼鸡比兔多10只但鸡脚却比兔脚少60只问鸡兔各几只...
  16. 计算机网络WAN接口,无线路由器WAN口连接类型如何选择【详细介绍】
  17. discuz接入七牛sdk
  18. 【R-CNN论文翻译】目标检测经典论文R-CNN最新版本(v5版)全面中文翻译
  19. 织梦网站频道管理员不能添加栏目
  20. Java中fifo什么意思_Java中的FIFO类

热门文章

  1. matlab手写板,手写MNISTmatlab实现
  2. 卡西欧计算机显示科学计数法怎么调回来,卡西欧计算器中的科学计数法键如何使用?请举例!急!...
  3. 这样一首歌,让人泪流满面
  4. XP中超级终端使用方法
  5. 关于淘宝 TOP 开发 使用的一些心得,问题不断更新中。。。
  6. 全自动化学发光免疫分析仪行业调研报告 - 市场现状分析与发展前景预测
  7. 设计师一定要知道这几个网站,解决你80%的设计素材。
  8. OpenCV图像处理-模糊
  9. DB2 For AS400 字符函数
  10. 获取国家统计局行政区划数据(复制粘贴)