【位运算 状态压缩 枚举子集】1178. 猜字谜

简介: 【位运算 状态压缩 枚举子集】1178. 猜字谜

本文涉及知识点

枚举子集 位运算

LeetCode 1178. 猜字谜

外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。

字谜的迷面 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 <= 105

4 <= words[i].length <= 50

1 <= puzzles.length <= 104

puzzles[i].length == 7

words[i][j], puzzles[i][j] 都是小写英文字母

每个 puzzles[i] 所包含的字符都不重复。

状态压缩

状态压缩:如果存在字母ch ,则第(ch-‘a’)位为1。

mMaskCnt[i] 记录包括字母’a’+i的所有words[k]的mask的数量

通过p枚举puzzles

假定p的mask是mask1,则枚举mask所有的自己sub,累加:mMaskCnt[p[0]-‘a’][sub]

注意

for (int sub = iMask; sub; sub = (sub - 1) & iMask)

这样的时间复杂度是:O(27)

不能for(sub = 0 ;sub < iMask;sub++) 这样的时间复杂度是O(226)

代码

核心代码

class Solution {
public:
  vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
    unordered_map<int, int> mMaskCnt[26];
    for (const auto& s : words) {
      const int iMask = Mask(s);
      for (int i = 0; i < 26; i++) {
        if ((1 << i) & iMask) {
          mMaskCnt[i][iMask]++;
        }
      }
    }
    vector<int> vRet;
    for (const auto& s : puzzles) {
      const int iMask = Mask(s);
      int iRet = 0;
      for (int sub = iMask; sub; sub = (sub - 1) & iMask) {
        if (mMaskCnt[s[0] - 'a'].count(sub)) {
          iRet += mMaskCnt[s[0] - 'a'][sub];
        }       
      }
      vRet.emplace_back(iRet);
    }
    return vRet;
  }
  int Mask(const string& s) {
    int iMask = 0;
    for (const auto& ch : s) {
      iMask |= (1 << (ch - 'a'));
    }
    return iMask;
  }
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
    assert(t1 == t2);
}
template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
    if (v1.size() != v2.size())
    {
        assert(false);
        return;
    }
    for (int i = 0; i < v1.size(); i++)
    {
        Assert(v1[i], v2[i]);
    }
}
int main()
{
  vector<string> words, puzzles;
  {
    Solution sln;
    words = { "apple","pleas","please" },
      puzzles = { "aelpsxy","saelpxy","xaelpsy" };
    auto res = sln.findNumOfValidWords(words, puzzles);
    Assert(vector<int>{ 3, 2, 0}, res);
  }
  {
    Solution sln;
    words = { "apple","pleas","please" },
      puzzles = { "aelwxyz","aelpxyz","aelpsxy","saelpxy","xaelpsy" };
    auto res = sln.findNumOfValidWords(words, puzzles);
    Assert(vector<int>{0, 1, 3, 2, 0}, res);
  }
  {
    Solution sln;
    words = { "aaaa", "asas", "able", "ability", "actt", "actor", "access" },
      puzzles = { "aboveyz", "abrodyz", "abslute", "absoryz", "actresz", "gaswxyz" };
    auto res = sln.findNumOfValidWords(words, puzzles);
    Assert(vector<int>{1, 1, 3, 2, 4, 0}, res);
  }
  
}


相关文章
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
158 2
|
11月前
|
人工智能 运维 安全
亚太唯一!阿里云无影再度入选Gartner魔力象限
亚太唯一!阿里云无影再度入选Gartner魔力象限
259 1
|
PyTorch 算法框架/工具 异构计算
Transformers 4.37 中文文档(八十四)(5)
Transformers 4.37 中文文档(八十四)
79 3
|
存储 安全 数据管理
DAMA数据管理知识体系指南(0):综述 & 学习指南
DAMA:国际数据管理协会,是一个全球性数据管理和业务专业志愿人士组成的非营利协会,是当前国际上在数据治理领域最权威的机构。 DMBOK2则是DAMA组织众多数据管理领域的国际级资深专家编著,深入阐述数据管理各领域的完整知识体系。它是市场上唯一综合了数据管理方方面面的一部权威性著作。 本系列文章,将针对DMBOK中的核心内容进行解读。
DAMA数据管理知识体系指南(0):综述 & 学习指南
|
Kubernetes API 容器
Kubernetes CKS【10】---Cluster Hardening - Restrict API Access
Kubernetes CKS【10】---Cluster Hardening - Restrict API Access
Kubernetes CKS【10】---Cluster Hardening - Restrict API Access
|
12天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
379 133
|
11天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
472 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话