[哈希表]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://www.pswp.cn/diannao/99118.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式与文本三剑客(grep、sed、awk)基础与实践

正则表达式基础与实践一、正则表达式概述1. 定义正则表达式(Regular Expression,简称 RE)是用于描述字符排列和匹配模式的语法规则,核心作用是对字符串进行分割、匹配、查找、替换操作。它本质是 “模式模板”,Linux 工…

eclipse中web项目编译后的lib里面jar为空问题处理

1. 检查项目构建配置验证项目性质右键单击项目 → Properties确认项目已正确配置:​Project Facets​:确保已勾选"Dynamic Web Module"​Targeted Runtimes​:确保已选择服务器运行时(如Tomcat)检查部署程序…

C语言中的递归问题——汉诺塔问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。传说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在…

ArkAnalyzer源码初步分析I——分析ts项目流程

1.前言: 鸿蒙程序分析框架ArkAnalyzer(方舟分析器) 源码地址 入门文档 2.阅读入门文档后: 本人具有一定的Java开发经验。虽然我对 TypeScript(TS)和 ArkTS 还不熟,但很多概念对我这个 Java 开…

c#基础二(类和对象,构造器调用顺序、访问级别、重写和多态、抽象类和接口)

一、类1.0对象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //写法一Student stunew Student();stu.name"Tom";stu.age20;//写法二Student stu2 new Student { name &qu…

Qt之快捷键、事件处理、自定义按键——完成记事本项目

快捷键我们电脑中的记事本中还支持快捷键,如“CTRLO”打开文件、“CTRLS”保存文件在Qt中使用QShortcut这个类创建快捷键在.cpp文件的构造函数中创建QShortcut对象,绑定打开文件和保存文件的槽函数放大缩小字体还是在.cpp的构造函数中编写代码Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一个Face

理论介绍 在OpenCASCADE几何建模内核中,BRepAlgoAPI_Splitter是一个强大的工具,用于将一个形状(Shape)用另一个形状(Tool)进行分割。这种操作在CAD建模中非常常见,比如用平面切割实体、用曲线分…

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法1. Baichuan-M2 医疗大模型简介1.1 基本信息1.2 下载地址1.3 技术特点2. Baichuan-M2 模型技术报告2.1 摘要2.2 医学性能评估2.2.1 HealthBench基准2.2.2 中国医疗场景对比评估2.3 系统架构2.3.1 验证器系统2.…

unity pcd 二进制版 简单显示文件对象(单色)

unity Point Cloud Viewer and Tool 那个插件不支持pcd二进制,而且网上到处都是AI 我恨这种AI滥用,提供不了一点价值 好了,言归正传 可以在Point Cloud Viewer and Tool这个插件报错地方转用这个代码,具体咋结合请自行研究。 …

强大的开源文档问答工具-Kotaemon

Kotaemon 是一个基于 RAG(Retrieval-Augmented Generation)架构的开源文档问答工具,为用户提供与文档对话的智能交互体验。该项目同时服务于终端用户和开发者,具有高度的可扩展性和定制化能力。技术栈分析核心技术栈后端框架Pytho…

区块链:搭建简单Fabric网络并调用智能合约

使用docker服务搭建Hyperledger/fabric网络的详细教程,实现构建多节点的简单联盟链,并编写、调用智能合约实现投票业务。 目录 背景知识 Hyperledger Fabric 基本组件 交易(Transaction) 智能合约 实验目的 实验环境 基础依赖 安装Golang 安装do…

Web前端面试题(2)

Web前端面试题(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 与 import 的区别和用法 主要区别 特性<link>import语法类型HTML标签CSS规则加载方式并行加载&#xff08;与其他资源同时加载&#xff09;串行加载&#xff08;必须等待主CSS文件…

Paxos协议

目录 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色与职责&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常见问题与对策 什么是多数派&#xff08;Quorum&#xff09; Paxos vs Raft 异同点 Paxos 是什…

第十二篇:Qcom Camx打印实时帧率 FPS

一、第一种方式(有些低平台可能没有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A规则+敏捷开发5S规则

网上研究别人的一些规则,也搞一份给大家 6A工作流项目规则 身份定义 你是一位资深的软件架构师和工程师,具备丰富的项目经验和系统思维能力。你的核心优势在于: 上下文工程专家:构建完整的任务上下文,而非简单的提示响应 规范驱动思维:将模糊需求转化为精确、可执行的规…

【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:

目录 引言 1 nginx.conf的整体结构 2 main全局块详解 2.1 核心指令解析 2.1.1 user&#xff1a;运行用户 2.1.2 worker_processes&#xff1a;工作进程数 2.1.3 pid&#xff1a;PID文件路径 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main块配置示例…

【前端教程】从基础到优化:一个登录页面的完善过程

最近做了一个简单的登录页面,主要练习了文本框的onfocus与onblur事件的使用。虽然功能实现了,但仔细想想还有不少可以改进的地方。今天就来分享一下这个登录页面的开发过程和优化思路。 初始实现与解析 先来看一下最初的实现代码: <!DOCTYPE html> <html> &l…

独家 | 抖音生活服务调整:涂晴接管市场和达人运营,旭凯担任北部大区负责人

文/刀客doc(头条精选作者)刀客doc独家获悉&#xff0c;9月8日抖音生活服务完成新一轮组织调整&#xff0c;并已在内部all hands完成官宣。此次调整主要涉及北部大区、达人运营与市场部三大条线的人事轮换与汇报关系变更。核心变动如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象类和接口

抽象类 需要用abstract 修饰类和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】队列queue的使用

语法 在 C 中&#xff0c;队列的语法如下&#xff1a; #include <queue>// 声明队列 std::queue<Type> q;这里 Type 是队列中存储元素的数据类型。 常用操作 队列提供了以下常用操作&#xff1a; empty(): 检查队列是否为空。 size(): 返回队列中的元素数量。 fron…