|
| 1 | +--- |
| 2 | +title: 966.元音拼写检查器:三个哈希表实现 |
| 3 | +date: 2025-09-14 22:53:03 |
| 4 | +tags: [题解, LeetCode, 中等, 数组, 哈希表, set, map, 字符串] |
| 5 | +categories: [题解, LeetCode] |
| 6 | +--- |
| 7 | + |
| 8 | +# 【LetMeFly】966.元音拼写检查器:三个哈希表实现 |
| 9 | + |
| 10 | +力扣题目链接:[https://leetcode.cn/problems/vowel-spellchecker/](https://leetcode.cn/problems/vowel-spellchecker/) |
| 11 | + |
| 12 | +<p>在给定单词列表 <code>wordlist</code> 的情况下,我们希望实现一个拼写检查器,将查询单词转换为正确的单词。</p> |
| 13 | + |
| 14 | +<p>对于给定的查询单词 <code>query</code>,拼写检查器将会处理两类拼写错误:</p> |
| 15 | + |
| 16 | +<ul> |
| 17 | + <li>大小写:如果查询匹配单词列表中的某个单词(<strong>不区分大小写</strong>),则返回的正确单词与单词列表中的大小写相同。 |
| 18 | + |
| 19 | + <ul> |
| 20 | + <li>例如:<code>wordlist = ["yellow"]</code>, <code>query = "YellOw"</code>: <code>correct = "yellow"</code></li> |
| 21 | + <li>例如:<code>wordlist = ["Yellow"]</code>, <code>query = "yellow"</code>: <code>correct = "Yellow"</code></li> |
| 22 | + <li>例如:<code>wordlist = ["yellow"]</code>, <code>query = "yellow"</code>: <code>correct = "yellow"</code></li> |
| 23 | + </ul> |
| 24 | + </li> |
| 25 | + <li>元音错误:如果在将查询单词中的元音 <code>('a', 'e', 'i', 'o', 'u')</code> 分别替换为任何元音后,能与单词列表中的单词匹配(<strong>不区分大小写</strong>),则返回的正确单词与单词列表中的匹配项大小写相同。 |
| 26 | + <ul> |
| 27 | + <li>例如:<code>wordlist = ["YellOw"]</code>, <code>query = "yollow"</code>: <code>correct = "YellOw"</code></li> |
| 28 | + <li>例如:<code>wordlist = ["YellOw"]</code>, <code>query = "yeellow"</code>: <code>correct = ""</code> (无匹配项)</li> |
| 29 | + <li>例如:<code>wordlist = ["YellOw"]</code>, <code>query = "yllw"</code>: <code>correct = ""</code> (无匹配项)</li> |
| 30 | + </ul> |
| 31 | + </li> |
| 32 | +</ul> |
| 33 | + |
| 34 | +<p>此外,拼写检查器还按照以下优先级规则操作:</p> |
| 35 | + |
| 36 | +<ul> |
| 37 | + <li>当查询完全匹配单词列表中的某个单词(<strong>区分大小写</strong>)时,应返回相同的单词。</li> |
| 38 | + <li>当查询匹配到大小写问题的单词时,您应该返回单词列表中的第一个这样的匹配项。</li> |
| 39 | + <li>当查询匹配到元音错误的单词时,您应该返回单词列表中的第一个这样的匹配项。</li> |
| 40 | + <li>如果该查询在单词列表中没有匹配项,则应返回空字符串。</li> |
| 41 | +</ul> |
| 42 | + |
| 43 | +<p>给出一些查询 <code>queries</code>,返回一个单词列表 <code>answer</code>,其中 <code>answer[i]</code> 是由查询 <code>query = queries[i]</code> 得到的正确单词。</p> |
| 44 | + |
| 45 | +<p> </p> |
| 46 | + |
| 47 | +<p><strong>示例 1:</strong></p> |
| 48 | + |
| 49 | +<pre> |
| 50 | +<strong>输入:</strong>wordlist = ["KiTe","kite","hare","Hare"], queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"] |
| 51 | +<strong>输出:</strong>["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]</pre> |
| 52 | + |
| 53 | +<p><strong>示例 2:</strong></p> |
| 54 | + |
| 55 | +<pre> |
| 56 | +<b>输入:</b>wordlist = ["yellow"], queries = ["YellOw"] |
| 57 | +<b>输出:</b>["yellow"] |
| 58 | +</pre> |
| 59 | + |
| 60 | +<p> </p> |
| 61 | + |
| 62 | +<p><strong>提示:</strong></p> |
| 63 | + |
| 64 | +<ul> |
| 65 | + <li><code>1 <= wordlist.length, queries.length <= 5000</code></li> |
| 66 | + <li><code>1 <= wordlist[i].length, queries[i].length <= 7</code></li> |
| 67 | + <li><code>wordlist[i]</code> 和 <code>queries[i]</code> 只包含英文字母</li> |
| 68 | +</ul> |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +## 解题方法:哈希表 |
| 73 | + |
| 74 | +第一优先级:字符串完全相同。我们只需要使用一个哈希表把原始字符加入哈希表中,对于一个query就能知道是否存在完全匹配的word了。若存在则返回,不存在进入第二优先级。 |
| 75 | + |
| 76 | +第二优先级:字符串忽略大小写看是否相同。我们只需要将每个字符串全转为小写字母后插入哈希表即可。键为小写字符串,值为第一个对应这个小写字符串的原始字符串。对于一个query,小写字符化后看是否在哈希表中,若在则返回否则进入第三优先级。 |
| 77 | + |
| 78 | +第三优先级:字符串忽略大小写且可以自由替换元音音符。将字符串小写后并将所有元音音符替换为'a'并插入哈希表中。插入方式和query方式同上。 |
| 79 | + |
| 80 | +第四优先级:直接返回空字符串。 |
| 81 | + |
| 82 | ++ 时间复杂度$O((w+q)L)$,其中$w=len(wordlist)$,$q=len(queries)$,$L$是平均一个单词的长度 |
| 83 | ++ 空间复杂度$O(wL)$ |
| 84 | + |
| 85 | +### AC代码 |
| 86 | + |
| 87 | +#### C++ |
| 88 | + |
| 89 | +```cpp |
| 90 | +/* |
| 91 | + * @Author: LetMeFly |
| 92 | + * @Date: 2025-09-14 15:21:26 |
| 93 | + * @LastEditors: LetMeFly.xyz |
| 94 | + * @LastEditTime: 2025-09-14 15:33:04 |
| 95 | + */ |
| 96 | +class Solution { |
| 97 | +private: |
| 98 | + string toLower(string s) { |
| 99 | + for (char& c : s) { |
| 100 | + if ('A' <= c && c <= 'Z') { |
| 101 | + c = tolower(c); |
| 102 | + } |
| 103 | + } |
| 104 | + return s; |
| 105 | + } |
| 106 | + |
| 107 | + string toAeiou(string s) { |
| 108 | + for (char& c : s) { |
| 109 | + if (c == 'e' || c == 'i' || c == 'o' || c == 'u') { |
| 110 | + c = 'a'; |
| 111 | + } |
| 112 | + } |
| 113 | + return s; |
| 114 | + } |
| 115 | +public: |
| 116 | + vector<string> spellchecker(vector<string>& wordlist, vector<string>& queries) { |
| 117 | + unordered_set<string> original; |
| 118 | + unordered_map<string, string> lowers, aeious; // 其实改为<string, int>只存下标也行 |
| 119 | + for (string& s : wordlist) { |
| 120 | + original.insert(s); |
| 121 | + string lower = toLower(s); |
| 122 | + if (!lowers.count(lower)) { |
| 123 | + lowers[lower] = s; |
| 124 | + } |
| 125 | + string aeiou = toAeiou(lower); |
| 126 | + if (!aeious.count(aeiou)) { |
| 127 | + aeious[aeiou] = s; |
| 128 | + } |
| 129 | + } |
| 130 | + for (string& q : queries) { |
| 131 | + if (original.count(q)) { |
| 132 | + continue; |
| 133 | + } |
| 134 | + string lower = toLower(q); |
| 135 | + if (lowers.count(lower)) { |
| 136 | + q = lowers[lower]; |
| 137 | + continue; |
| 138 | + } |
| 139 | + string aeiou = toAeiou(lower); |
| 140 | + if (aeious.count(aeiou)) { |
| 141 | + q = aeious[aeiou]; |
| 142 | + continue; |
| 143 | + } |
| 144 | + q = ""; // 这个别忘了 |
| 145 | + } |
| 146 | + return queries; |
| 147 | + } |
| 148 | +}; |
| 149 | +``` |
| 150 | +
|
| 151 | +> 同步发文于[CSDN](https://letmefly.blog.csdn.net/article/details/151690858)和我的[个人博客](https://blog.letmefly.xyz/),原创不易,转载经作者同意后请附上[原文链接](https://blog.letmefly.xyz/2025/09/14/LeetCode%200966.%E5%85%83%E9%9F%B3%E6%8B%BC%E5%86%99%E6%A3%80%E6%9F%A5%E5%99%A8/)哦~ |
| 152 | +> |
| 153 | +> 千篇源码题解[已开源](https://github.com/LetMeFly666/LeetCode) |
0 commit comments