966. Vowel Spellchecker
Description
Given a wordlist, we want to implement a spellchecker that converts a query word into a correct word.
For a given query word, the spell checker handles two categories of spelling mistakes:
- Capitalization: If the query matches a word in the wordlist (case-insensitive), then the query word is returned with the same case as the case in the wordlist.
- Example:
wordlist = ["yellow"],query = "YellOw":correct = "yellow" - Example:
wordlist = ["Yellow"],query = "yellow":correct = "Yellow" - Example:
wordlist = ["yellow"],query = "yellow":correct = "yellow"
- Example:
- Vowel Errors: If after replacing the vowels
('a', 'e', 'i', 'o', 'u')of the query word with any vowel individually, it matches a word in the wordlist (case-insensitive), then the query word is returned with the same case as the match in the wordlist.- Example:
wordlist = ["YellOw"],query = "yollow":correct = "YellOw" - Example:
wordlist = ["YellOw"],query = "yeellow":correct = ""(no match) - Example:
wordlist = ["YellOw"],query = "yllw":correct = ""(no match)
- Example:
In addition, the spell checker operates under the following precedence rules:
- When the query exactly matches a word in the wordlist (case-sensitive), you should return the same word back.
- When the query matches a word up to capitalization, you should return the first such match in the wordlist.
- When the query matches a word up to vowel errors, you should return the first such match in the wordlist.
- If the query has no matches in the wordlist, you should return the empty string.
Given some queries, return a list of words answer, where answer[i] is the correct word for query = queries[i].
Example 1:
Input: wordlist = ["KiTe","kite","hare","Hare"], queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"] Output: ["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]
Example 2:
Input: wordlist = ["yellow"], queries = ["YellOw"] Output: ["yellow"]
Constraints:
1 <= wordlist.length, queries.length <= 50001 <= wordlist[i].length, queries[i].length <= 7wordlist[i]andqueries[i]consist only of only English letters.
Solutions
Solution 1: Hash Table
Thinking
A query maps to the word list by exact match, then case-insensitive match, then vowel-insensitive match, taking the earliest word at that level. Build three tables: the original set, the first lowercase occurrence, and the first occurrence after vowels become *. Each query probes the tables in that order.
We traverse the \(\textit{wordlist}\) and store the words in hash tables \(\textit{low}\) and \(\textit{pat}\) according to case-insensitive and vowel-insensitive rules, respectively. The key of \(\textit{low}\) is the lowercase form of the word, and the key of \(\textit{pat}\) is the string obtained by replacing the vowels of the word with *, with the value being the word itself. We use the hash table \(\textit{s}\) to store the words in \(\textit{wordlist}\).
We traverse \(\textit{queries}\), for each word \(\textit{q}\), if \(\textit{q}\) is in \(\textit{s}\), it means \(\textit{q}\) is in \(\textit{wordlist}\), and we directly add \(\textit{q}\) to the answer array \(\textit{ans}\); otherwise, if the lowercase form of \(\textit{q}\) is in \(\textit{low}\), it means \(\textit{q}\) is in \(\textit{wordlist}\) and is case-insensitive, and we add \(\textit{low}[q.\text{lower}()]\) to the answer array \(\textit{ans}\); otherwise, if the string obtained by replacing the vowels of \(\textit{q}\) with * is in \(\textit{pat}\), it means \(\textit{q}\) is in \(\textit{wordlist}\) and is vowel-insensitive, and we add \(\textit{pat}[f(q)]\) to the answer array \(\textit{ans}\); otherwise, it means \(\textit{q}\) is not in \(\textit{wordlist}\), and we add an empty string to the answer array \(\textit{ans}\).
Finally, we return the answer array \(\textit{ans}\).
The time complexity is \(O(n + m)\), and the space complexity is \(O(n)\), where \(n\) and \(m\) are the lengths of \(\textit{wordlist}\) and \(\textit{queries}\), respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |