题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于已构建的神奇字典中。
实现 MagicDictionary 类:
MagicDictionary magicDictionary = new MagicDictionary();
magicDictionary.buildDict(["hello", "leetcode"]);
magicDictionary.search("hello"); // 返回 False
magicDictionary.search("hhllo"); // 将第二个 'h' 替换为 'e' 可以匹配 "hello" ,所以返回 True
magicDictionary.search("hell"); // 返回 False
magicDictionary.search("leetcoded"); // 返回 False
# 方法1: 数组存原始单词+搜索时遍历数组
class MagicDictionary:
def __init__(self):
"""
Initialize your data structure here.
"""
self.dict = []
def buildDict(self, dictionary: List[str]) -> None:
self.dict = dictionary
def search(self, searchWord: str) -> bool:
def match(d, w):
if len(d) != len(w):
# 长度不相等, 不匹配
return False
hasDiff = False
for c1, c2 in zip(d, w):
if c1 != c2:
if hasDiff:
# 超过一个字符不同, 不匹配
return False
hasDiff = True
# 注意最终需要保证两单词恰好有一个字符不同
return hasDiff
for d in self.dict:
if match(d, searchWord):
return True
return False
# 方法2 (优化search): 集合+buildDict时存所有变种
class MagicDictionary:
def __init__(self):
"""
Initialize your data structure here.
"""
self.dict = set()
def buildDict(self, dictionary: List[str]) -> None:
for w in dictionary:
for i, c in enumerate(w):
for o in range(26):
# 将i位字符替换成其他字符
cc = chr(ord("a") + o)
if cc != c:
# 注意: 不能存储原始单词, 必须替换一个字符
cur = w[:i] + cc + w[i + 1 :]
self.dict.add(cur)
def search(self, searchWord: str) -> bool:
return searchWord in self.dict
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~