LeetCode 1178. 猜字谜(状态压缩+枚举二进制子集+哈希)
文章目录
- 1. 题目
- 2. 解题
1. 题目
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。
字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:
- 单词
word
中包含谜面puzzle
的第一个字母。 - 单词
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] 所包含的字符都不重复。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-valid-words-for-each-puzzle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:
LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)
LeetCode 5756. 两个数组最小的异或值之和(状态压缩DP)
LeetCode 5869. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
class Solution {public:vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {// 处理 words 变成二进制位表示是否出现每种字符,转化成整数unordered_map<int, int> m;for(auto& w : words){int v = 0;for(auto c : w)v |= 1<<(c-'a');m[v]++;}// 遍历谜面vector<int> ans(puzzles.size());for(int i = 0; i < puzzles.size(); ++i){int bit = puzzles[i][0]-'a';//谜面的首字符位置int v = 0;for(auto c : puzzles[i])v |= 1<<(c-'a');// 枚举 v 的二进制状态子集for(int s = v; s>0; s = (s-1)&v){if((s&(1<<bit)) && m.count(s))//状态包含谜面首字符ans[i] += m[s];}}return ans;}
};
144 ms 28.7 MB C++
祝大家元宵节快乐!
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1178. 猜字谜(状态压缩+枚举二进制子集+哈希)相关推荐
- leetcode 1178.猜字谜
leetcode 1178.猜字谜 题干 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧. 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么 ...
- 记录一下leetcode:1178猜字谜
import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;/*** leetcode ...
- leetcode 1178. 猜字谜(位运算)
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧. 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底: 单词 word 中包含 ...
- LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
文章目录 1. 题目 2. 解题 2.1 超时 2.2 预处理优化 1. 题目 给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 . 两个子序列在原字符串中如果 ...
- 【力扣】1178. 猜字谜
以下为力扣官方题解 1178. 猜字谜 题目 示例 提示 官方题解 前言 方法一 二进制状态压缩 思路与算法 细节 代码 复杂度分析 方法二:字典树 思路与算法 细节 代码 复杂度分析 题目 外国友人 ...
- POJ 1873 The Fortified Forest (凸包,状态压缩枚举)
题目链接:http://poj.org/problem?id=1873 题意:给出一些树,每棵树有坐标,高度,以及价值,要求砍掉一些树,用那些木材,将其它树围起来,要求花最小的代价,代价相同,要求砍掉 ...
- LeetCode 5485. 找出最长的超赞子字符串 (状态压缩、二进制、位运算、前缀和)
5485. 找出最长的超赞子字符串 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次 ...
- c++ 输出二进制_【位运算与状态压缩】二进制的魅力
[引言] 今天讲讲位运算与状态压缩. 位运算涉及系统底层的运算,骚操作很多:状态压缩则是编程中空间优化的有效手段,应该说两者本身其实并没有太直接的联系,但是在实际使用时会有一定的结合, ...
- AcWing 1960. 闪烁(状态压缩+枚举)
题目链接 https://www.acwing.com/problem/content/1962/ 思路 这题如果用一个数组的话是会炸空间的,所以我们采用状态压缩,因为每个灯的状态只有0和1,那么我们 ...
最新文章
- 【反传销】春节一个短暂误入传销和脱身的真实故事以及对技术的思考
- Qt Creator查找和更换
- Syntax error: word unexpected (expecting ))错误的解决方法
- stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动
- 人一生中最该看清的5个真相
- 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
- C++ 类和对象成员特性
- Redis登陆服务器和批量删除指定的key
- 【星云测试】开发者测试(2)-采用精准测试工具对J2EE Guns开发框架进行测试
- ES | CentOS下基于ElasticSearch的head插件安装
- tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始
- 摘要抽取算法——最大边界相关算法MMR(Maximal Marginal Relevance)
- Boost C++ 智能指针
- 对网站商城源码的研究分析 分享大量源码下载
- 网络安全笔记-DDoS攻击
- 深入Elasticsearch:索引的创建
- unicloud进阶uni-id入门(一)---uni-id能做什么?
- 基于 Java 的 I Don’t Wanna Be The Bugger 冒险游戏【100010211】
- 正版现货黄金怎么区分(上)
- 金融行业移动信息化解决方案