题目
思路一 暴力
如果一个字符中只有一个字符可以更改,那么它们的汉明距离为1.在搜索新单词时,只检查长度相同的单词。
代码一
class MagicDictionary:
def __init__(self):
self.buckets = collections.defaultdict(list)
def buildDict(self, dictionary: List[str]) -> None:
for word in dictionary:
self.buckets[len(word)].append(word);
def search(self, searchWord: str) -> bool:
return any(sum(a != b for a, b in zip(candidate, searchWord)) == 1 for candidate in self.buckets[len(searchWord)])
思路二 广义邻居
定义广义邻居为单词中每一个字符被特殊符号替换,那个一个单词word有len(word)个广义邻居。将字典以集合形式保存下来,保存词典中每个单词的每个广义邻居,以字典形式保存,键为广义邻居,值为该广义邻居出现的次数。查询时,判断该广义邻居出现次数。如果次数大于1,那么肯定返回true。如果次数等于1,还要判断查找的单词不在字典中,才能返回true。
代码二
class MagicDictionary:
def _genneighbors(self, word):
for i in range(len(word)):
yield word[:i] + '#' + word[i + 1:]
def buildDict(self, dictionary: List[str]) -> None:
self.words = set(dictionary)
self.count = collections.Counter(nei for word in dictionary for nei in self._genneighbors(word))
def search(self, searchWord: str) -> bool:
return any(self.count[nei] > 1 or
self.count[nei] == 1 and searchWord not in self.words
for nei in self._genneighbors(searchWord))