千问 LeetCode 2227. 加密解密字符串 Python3实现
2026/5/11 12:31:45 网站建设 项目流程

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 + 回溯,但本题无需。此解法简洁高效。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询