[哈希表]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
英文地址,請注明出處:http://en.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…