当前位置: 首页 > news >正文

千问 LeetCode 2227. 加密解密字符串 Python3实现

LeetCode 2227. 加密解密字符串 的核心在于:

- 加密 是确定性的:每个字符映射到一个固定长度为2的字符串;
- 解密 是非确定性的(一对多),但题目只要求统计有多少个字典中的单词能被加密成给定密文。

因此,高效做法是:
预处理字典中所有单词的加密结果,并用哈希表统计每种密文出现的次数。

这样 decrypt(word2) 就变成一次 O(1) 的哈希查找。

✅ Python3 实现如下:

from typing import List
from collections import defaultdict

class Encrypter:

def init(self, keys: List[str], values: List[str], dictionary: List[str]):
# 构建字符 -> 密文的映射
self.char_to_val = {k: v for k, v in zip(keys, values)}

# 预先将 dictionary 中每个词加密,并统计密文频次
self.encrypted_count = defaultdict(int)
for word in dictionary:
encrypted = self.encrypt(word)
if encrypted != "": # 如果加密成功(即word中所有字符都在keys中)
self.encrypted_count[encrypted] += 1

def encrypt(self, word1: str) -> str:
res = []
for ch in word1:
if ch not in self.char_to_val:
return "" # 无法加密,返回空字符串
res.append(self.char_to_val[ch])
return "".join(res)

def decrypt(self, word2: str) -> int:
return self.encrypted_count[word2]

📌 示例验证:

输入
encrypter = Encrypter(
keys=['a', 'b', 'c', 'd'],
values=["ei", "zf", "ei", "am"],
dictionary=["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]
)

print(encrypter.encrypt("abcd")) # 输出: "eizfeiam"
print(encrypter.decrypt("eizfeiam")) # 输出: 2

解释:
- "abcd" → "ei" + "zf" + "ei" + "am" = "eizfeiam"
- "eizfeiam" 解密时:
- "ei" 可对应 'a' 或 'c'
- "zf" → 'b'
- "am" → 'd'
- 所有可能原文包括 "abad", "cbad", "abcd", "cbcd" 等
- 其中只有 "abcd" 和 "abad" 在 dictionary 中 → 返回 2

⏱️ 复杂度分析:

- 初始化:O(D × L),D = dictionary 长度,L = 平均单词长度
- encrypt():O(N),N = word1 长度
- decrypt():O(1)

完全满足题目约束(dictionary ≤ 100,调用次数 ≤ 200)。

如需进一步优化或扩展(比如支持动态添加字典词),可考虑 Trie + 回溯,但本题无需。此解法简洁高效。

http://www.jsqmd.com/news/795769/

相关文章:

  • Unitree GO2 ROS2 SDK完整指南:5步实现四足机器人智能控制与自主导航
  • 2026年中石化加油卡回收靠谱平台最新深度测评 - 京顺回收
  • [具身智能-622]:高速图像传感器接口(视觉 / 摄像头)与数据格式
  • 别再只加contentDescription了!Android无障碍适配TalkBack的7个实战避坑点(含完整代码)
  • 根据用户主动关注用户和用户朋友圈以及其他关系层面平台注入的用户 系统推荐程序返回用户推荐列表
  • 第四章 数字孪生制作完整流程
  • 无人机通信安全渗透测试:从信号拦截到GPS欺骗的完整攻防框架
  • 茅台自动预约系统:告别手动抢购,实现智能预约的完整解决方案
  • 从零到精通:手把手教你用BusHound分析SCSI Sense错误码(附完整排查流程)
  • 终极指南:如何通过Typora插件实现高效文件管理与快速切换
  • 洛谷比赛分级
  • 如何用FanControl在5分钟内解决Windows风扇噪音问题?
  • mkcert进阶玩法:一键生成局域网HTTPS证书,让内网测试告别“不安全”警告(含Windows/Linux/Mac多平台指南)
  • WebGLM:基于检索增强生成(RAG)的实时联网智能问答系统实战解析
  • 金仓数据库 V9R4C19 安全加固实战:禁用 root 部署 + hashbytes 单向哈希
  • 大模型中转哪个技术机构靠谱
  • 2026年论文AI率爆表?掌握这2招快速去AI痕迹,导师挑不出毛病! - 降AI实验室
  • 如何彻底卸载Windows Defender:2025完整移除工具使用指南
  • PDPI Spec:规格驱动开发如何提升AI时代软件工程效率
  • 不只是Target选错:深挖Metasploit中‘Exploit completed, but no session’的3个隐蔽原因与对策
  • 基于Claude的智能代码质量监控工具设计与实践
  • 别再死记硬背三段式状态机了!用HDLbits的Simple FSM题,带你搞懂Verilog状态机设计的核心差异
  • 12万Star的Karpathy skills:四原则修正 LLM 编码行为
  • Simulink给STM32做自动代码生成?我实测了F4和H7系列,这些坑你得提前知道
  • 2026遥感、地球科学与人工智能国际学术会议(RSGAI 2026)
  • FFXIV TexTools终极指南:打造《最终幻想14》专属视觉体验的三大核心模块
  • 闲鱼自动化脚本开发实战:基于uiautomator2的UI自动化与风控对抗
  • Go语言技能树构建:从知识体系到评估引擎的工程实践
  • Teamcenter 13 部署实战:从零到一构建企业级PLM环境
  • 从HIDL到HAL3:手把手拆解Android相机Provider进程的通信与数据流转