Vowel Spellchecker
Problem Statement
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"
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)
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.
Code
class Solution:
def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:
f = lambda x: ''.join('$' if ch in 'aeiou' else ch for ch in x)
cap, vow = defaultdict(str), defaultdict(str)
word_set, ans = set(wordlist), []
for w in wordlist: # Build the dicts
wLow = w.lower()
if not cap[wLow]: cap[wLow] = w # <–– Case 1: capital-check
wVow = f(wLow)
if not vow[wVow]: vow[wVow] = w # <–– Case 2: vowel-check
for q in queries:
qLow, qVow, res = q.lower(), f(q.lower()), ''
if q in word_set: res = q # <–– word is in wordlist
elif qLow in cap: res = cap[qLow] # <–– cap-checked word is in wordlist
elif qVow in vow: res = vow[qVow] # <–– vowel-checked word is in wordlist
ans.append(res)