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 capitlization, 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 <= 5000
1 <= wordlist[i].length, queries[i].length <= 7
wordlist[i]
andqueries[i]
consist only of only English letters.
Solutions
Solution 1: Hash Table
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 |
|