Solving Leetcode Interviews in Seconds with AI: Vowel Spellchecker
Introduction
In this blog post, we will explore how to solve the LeetCode problem "966" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
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] and queries[i] consist only of only English letters.
Explanation
Here's a breakdown of the approach, complexity, and Python code for the spellchecker problem:
- Exact Match: First, check if the query exists in the
wordlistexactly as is. If it does, return the query. - Case-Insensitive Match: Use a dictionary to store lowercase versions of words in the
wordlistalong with their original case. If a case-insensitive match is found, return the originally cased word from the wordlist (first occurrence). Vowel Error Match: Create a dictionary to store vowel-replaced versions of words in the
wordlist(using a canonical form where all vowels are replaced with a placeholder like '*'). If a vowel error match is found (case-insensitive), return the originally cased word from the wordlist (first occurrence).Runtime Complexity: O(N + M K), where N is the length of
wordlist, M is the length ofqueries, and K is the average length of words in both lists (at most 7 according to the constraints). Storage Complexity: O(N K) due to storing words in lowercase and vowel-replaced formats in dictionaries.
Code
def spellchecker(wordlist, queries):
exact_set = set(wordlist)
case_map = {}
vowel_map = {}
def devowel(word):
word = word.lower()
new_word = ""
for char in word:
if char in "aeiou":
new_word += "*"
else:
new_word += char
return new_word
for word in wordlist:
lower_word = word.lower()
if lower_word not in case_map:
case_map[lower_word] = word
vowel_word = devowel(word)
if vowel_word not in vowel_map:
vowel_map[vowel_word] = word
result = []
for query in queries:
if query in exact_set:
result.append(query)
continue
lower_query = query.lower()
if lower_query in case_map:
result.append(case_map[lower_query])
continue
vowel_query = devowel(query)
if vowel_query in vowel_map:
result.append(vowel_map[vowel_query])
continue
result.append("")
return result