LeetCode 966. Vowel Spellchecker
有點麻煩的題,比較注重題目理解及實作。
題目
以wordlist建立檢查方式:
- 完全符合,直接輸出
- 大小寫不同,輸出預測的結果
- 母音調換,輸出預測的結果
- 皆不符合則輸出空字串
必須依照以上優先及順序匹配,且在有多種可能性時以第一個結果為準。
解法
對應各種條件:
- 原字典直接裝進set
- 一律將單字轉成小寫,放入dict
- 將小寫字母音用’*‘替代,放入dict 之後依序處理各查詢即可。
因為要求第一個符合的結果,所以建立映射的時候要額外檢查是否已經有存值,不得更新。
class Solution:
def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:
VOWELS = set(list('aeiou'))
exact = set(wordlist)
cap = {}
vow = {}
def getPattern(x): return ''.join(['*' if c in VOWELS else c for c in x])
for w in wordlist:
lower = w.lower() # cap
ve = getPattern(lower) # vowel errors
if lower not in cap:
cap[lower] = w
if ve not in vow:
vow[ve] = w
ans = []
for q in queries:
if q in exact:
ans.append(q)
continue
lower = q.lower()
ve = getPattern(lower)
if lower in cap:
ans.append(cap[lower])
elif ve in vow:
ans.append(vow[ve])
else:
ans.append('')
return ans