966. 元音拼写检查器
class Solution:def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:origin = set(wordlist) # 存储原始单词用于完全匹配lower_to_origin = {} # 存储小写形式到原始单词的映射vowel_to_origin = {} # 存储元音模糊形式到原始单词的映射trans = str.maketrans("aeiou", "?????") # 创建元音替换表(小写)# 构建映射字典(优先保留先出现的单词)for s in wordlist:lower_s = s.lower()# 小写形式映射:仅当键不存在时添加if lower_s not in lower_to_origin:lower_to_origin[lower_s] = s# 元音模糊形式映射:先转为小写再替换元音vowel_s = lower_s.translate(trans)if vowel_s not in vowel_to_origin:vowel_to_origin[vowel_s] = s# 处理每个查询res = []for q in queries:# 1. 完全匹配(区分大小写)if q in origin:res.append(q)continuelower_q = q.lower()# 2. 不区分大小写匹配if lower_q in lower_to_origin:res.append(lower_to_origin[lower_q])continue# 3. 元音模糊匹配vowel_q = lower_q.translate(trans)if vowel_q in vowel_to_origin:res.append(vowel_to_origin[vowel_q])else:res.append("") # 无匹配返回空字符串return res
1. 类和方法的定义
spellchecker
方法,该方法的主要功能是实现一个拼写检查器。它接收两个参数:一个单词列表 wordlist
和一个查询列表 queries
,并返回一个与 queries
长度相同的列表,列表中的每个元素是对相应查询的最佳匹配结果
2. 初始化数据结构
origin = set(wordlist)
lower_to_origin = {}
vowel_to_origin = {}
trans = str.maketrans("aeiou", "?????") # 替换元音为 '?'
origin
:将wordlist
转换为集合,用于快速检查某个单词是否在原始单词列表中,因为集合的查找操作时间复杂度为 O(1)。lower_to_origin
:一个字典,用于存储小写形式的单词到原始单词的映射,方便进行不区分大小写的匹配。vowel_to_origin
:一个字典,用于存储将元音字母替换为'?'
后的小写单词到原始单词的映射,用于不区分大小写且元音模糊匹配。trans
:使用str.maketrans()
方法创建一个字符映射转换表,将元音字母'a'
、'e'
、'i'
、'o'
、'u'
替换为'?'
。
3. 遍历单词列表,构建映射关系
for s in reversed(wordlist):lower = s.lower()lower_to_origin[lower] = s # 例如 kite -> KiTevowel_to_origin[lower.translate(trans)] = s # 例如 k?t? -> KiTe
- 使用
reversed(wordlist)
反向遍历单词列表,这样在有多个匹配时,优先选择单词列表中靠后的单词。 lower = s.lower()
:将当前单词转换为小写形式。lower_to_origin[lower] = s
:将小写形式的单词作为键,原始单词作为值存入lower_to_origin
字典,用于不区分大小写的匹配。lower.translate(trans)
:使用之前创建的字符映射转换表trans
,将小写单词中的元音字母替换为'?'
。然后将替换后的单词作为键,原始单词作为值存入vowel_to_origin
字典,用于不区分大小写且元音模糊匹配。
4. 遍历查询列表,进行匹配操作
for i, q in enumerate(queries):if q in origin: # 完全匹配continuelower = q.lower()if lower in lower_to_origin: # 不区分大小写的匹配queries[i] = lower_to_origin[lower]else: # 不区分大小写+元音模糊匹配queries[i] = vowel_to_origin.get(lower.translate(trans), "")
- 使用
enumerate(queries)
同时获取查询单词的索引i
和单词q
。 if q in origin:
:检查查询单词是否在原始单词列表中,如果是,则不做处理,继续处理下一个查询。lower = q.lower()
:将查询单词转换为小写形式。if lower in lower_to_origin:
:检查小写形式的查询单词是否在lower_to_origin
字典中,如果是,则将查询结果替换为对应的原始单词。else:
:如果不满足上述条件,则进行不区分大小写且元音模糊匹配。使用lower.translate(trans)
将小写查询单词中的元音字母替换为'?'
,然后使用vowel_to_origin.get()
方法查找对应的原始单词。如果找到则替换查询结果,否则将查询结果替换为空字符串。
5. 返回结果
return queries
最后返回经过匹配处理后的查询列表。
示例代码运行
from typing import Listclass Solution:def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:origin = set(wordlist)lower_to_origin = {}vowel_to_origin = {}trans = str.maketrans("aeiou", "?????") # 替换元音为 '?'for s in reversed(wordlist):lower = s.lower()lower_to_origin[lower] = s # 例如 kite -> KiTevowel_to_origin[lower.translate(trans)] = s # 例如 k?t? -> KiTefor i, q in enumerate(queries):if q in origin: # 完全匹配continuelower = q.lower()if lower in lower_to_origin: # 不区分大小写的匹配queries[i] = lower_to_origin[lower]else: # 不区分大小写+元音模糊匹配queries[i] = vowel_to_origin.get(lower.translate(trans), "")return queries# 示例调用
solution = Solution()
wordlist = ["KiTe", "kite", "hare", "Hare"]
queries = ["kite", "Kite", "KiTe", "Hare", "HARE", "Hear", "hear", "keti", "keet", "keto"]
result = solution.spellchecker(wordlist, queries)
print(result)
这段代码通过构建不同的映射关系,实现了三种类型的拼写匹配:完全匹配、不区分大小写的匹配和不区分大小写且元音模糊匹配。