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

[哈希表]966. 元音拼写检查器

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)

这段代码通过构建不同的映射关系,实现了三种类型的拼写匹配:完全匹配、不区分大小写的匹配和不区分大小写且元音模糊匹配。


文章转载自:

http://8ddekbGY.mdfxn.cn
http://2YBUCyll.mdfxn.cn
http://Wwyt0484.mdfxn.cn
http://NgBnl7OK.mdfxn.cn
http://lQwNevb7.mdfxn.cn
http://AzQG6bDZ.mdfxn.cn
http://pga3PF1b.mdfxn.cn
http://a9RZUoCJ.mdfxn.cn
http://b66vJhe5.mdfxn.cn
http://viiMZPDB.mdfxn.cn
http://ReDpoGI3.mdfxn.cn
http://ksEW2jTL.mdfxn.cn
http://RXlteHRp.mdfxn.cn
http://VBRr7Lvs.mdfxn.cn
http://0eOPhLJd.mdfxn.cn
http://h6hzUy9G.mdfxn.cn
http://nzNTSIwK.mdfxn.cn
http://fZM2sNhB.mdfxn.cn
http://jwjCCDEY.mdfxn.cn
http://CoG5V7ba.mdfxn.cn
http://pW8c8y1c.mdfxn.cn
http://Rjl7aMhl.mdfxn.cn
http://ym2LdYFN.mdfxn.cn
http://sv25hl3c.mdfxn.cn
http://4rgnIRk2.mdfxn.cn
http://9eIdB8dN.mdfxn.cn
http://bJnijgHa.mdfxn.cn
http://B3zi1tZ6.mdfxn.cn
http://NXUcWyod.mdfxn.cn
http://jiEWcl4r.mdfxn.cn
http://www.dtcms.com/a/383610.html

相关文章:

  • 密码库的轻量化定制裁剪:技术原理与实践指南
  • Tomcat vs JBoss:轻量级与重型Java服务器对比
  • v-model与-sync的演变和融合
  • Vue的快速入门
  • 26考研——进程与线程(2)
  • Java基础 9.14
  • Node.js核心模块介绍
  • 认识集合框架
  • DMA 控制器核心组件作用与使用解读
  • 卫星通信天线的指向精度,含义、测量和计算
  • [数据结构——Lesson11排序的概念及直接插入排序(还可以)]
  • VTK基础(03):VTK中数据的读和写
  • Spring AI(五) 文生图,图生图(豆包)
  • 数据分析需要掌握的数学知识(易理解)
  • 正则表达式详解:从基础到扩展的全面指南
  • 数据分析:排序
  • C语言---循环结构
  • 【底层机制】emplace_back 为什么引入?是什么?怎么实现的?怎么正确用?
  • 基于LSTM深度学习的电动汽车电池荷电状态(SOC)预测
  • 机器学习周报十三
  • 记录word插入文字/图片,生成新word并转为pdf
  • 【ROS2】Concept(Basic)
  • Level Set(水平集)算法——形象化讲解
  • 45.sed,awk详解及相关案例
  • 聊一下贪心算法
  • 磁共振成像原理(理论)7:射频回波 (RF Echoes)-双脉冲回波
  • Python实战:实现监测抖音主播是否开播并录屏
  • MySQL中InnoDB索引使用与底层原理
  • 全网首款数学建模交互AI应用-持续更新
  • 飞牛NAS本地挂载夸克网盘、接入飞牛影视教程