【位运算 状态压缩 枚举子集】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);
  }
  
}


相关文章
|
移动开发 前端开发 安全
uni-app跨域调试你学会了没
uni-app跨域调试你学会了没
777 0
|
PyTorch 算法框架/工具 异构计算
Transformers 4.37 中文文档(八十四)(5)
Transformers 4.37 中文文档(八十四)
115 3
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
326 2
|
人工智能 运维 安全
亚太唯一!阿里云无影再度入选Gartner魔力象限
亚太唯一!阿里云无影再度入选Gartner魔力象限
378 1
|
JSON JavaScript 安全
XSS 检测神器:XSStrike 保姆级教程
XSS 检测神器:XSStrike 保姆级教程
|
存储 安全 数据管理
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
|
7天前
|
人工智能 安全 API
CoPaw:5分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。
|
10天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
11329 96
|
8天前
|
人工智能 安全 JavaScript
阿里云上+本地部署OpenClaw(小龙虾)新手攻略:解锁10大必备Skills,零基础也能玩转AI助手
2026年,开源AI代理工具OpenClaw(昵称“小龙虾”)凭借“能实际做事”的核心优势,在GitHub斩获25万+星标,成为现象级AI工具。它最强大的魅力在于可扩展的Skills(技能包)系统——通过ClawHub插件市场的数百个技能,能让AI助手从简单聊天升级为处理办公、学习、日常事务的全能帮手。
7325 25

热门文章

最新文章