【設計】B010_LC_元音拼寫檢查器(2 × Map + 統一將元音替換成#)

一、Problem

在給定單詞列表 wordlist 的情況下,我們希望實現一個拼寫檢查器,將查詢單詞轉換爲正確的單詞。

對於給定的查詢單詞 query,拼寫檢查器將會處理兩類拼寫錯誤:

  • 大小寫:如果查詢匹配單詞列表中的某個單詞(不區分大小寫),則返回的正確單詞與單詞列表中的大小寫相同。
    • 例如:wordlist = [“yellow”], query = “YellOw”: correct = “yellow”
    • 例如:wordlist = [“Yellow”], query = “yellow”: correct = “Yellow”
    • 例如:wordlist = [“yellow”], query = “yellow”: correct = “yellow”
  • 元音錯誤:如果在將查詢單詞中的元音(‘a’、‘e’、‘i’、‘o’、‘u’)分別替換爲任何元音後,能與單詞列表中的單詞匹配(不區分大小寫),則返回的正確單詞與單詞列表中的匹配項大小寫相同。
    • 例如:wordlist = [“YellOw”], query = “yollow”: correct = “YellOw”
    • 例如:wordlist = [“YellOw”], query = “yeellow”: correct = “” (無匹配項)
    • 例如:wordlist = [“YellOw”], query = “yllw”: correct = “” (無匹配項)

此外,拼寫檢查器還按照以下優先級規則操作:

  • 當查詢完全匹配單詞列表中的某個單詞(區分大小寫)時,應返回相同的單詞。
  • 當查詢匹配到大小寫問題的單詞時,您應該返回單詞列表中的第一個這樣的匹配項。
  • 當查詢匹配到元音錯誤的單詞時,您應該返回單詞列表中的第一個這樣的匹配項。
  • 如果該查詢在單詞列表中沒有匹配項,則應返回空字符串。

給出一些查詢 queries,返回一個單詞列表 answer,其中 answer[i] 是由查詢 query = queries[i] 得到的正確單詞。

輸入:wordlist = ["KiTe","kite","hare","Hare"], queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"]
輸出:["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]

提示:

1 <= wordlist.length <= 5000
1 <= queries.length <= 5000
1 <= wordlist[i].length <= 7
1 <= queries[i].length <= 7
wordlist 和 queries 中的所有字符串僅由英文字母組成。

二、Solution

方法一:2 × Map

由於可以將元音字母進行替換,但我們又不知道替換成什麼,所以我們統一一下將,用另一個 Map 映射 —> 查詢串 q 到將 q 中所有元音字母替換爲 # 的新串,這樣就做到了無差異對比

class Solution {
    public String[] spellchecker(String[] ws, String[] qs) {
        Set<String> st = new HashSet<>(Arrays.asList(ws));
        Map<String, String> m1 = new HashMap<>(), m2 = new HashMap<>();
        for (String w : ws) {
            String s = w.toLowerCase();
            m1.putIfAbsent(s, w);
            m2.putIfAbsent(s.replaceAll("[aeiou]", "#"), w);
        }
        int n = qs.length, i = 0;
        String[] ans = new String[n];

        for (String q : qs) {
            if (st.contains(q))
                ans[i++] = q;
            else {
                String s = q.toLowerCase();
                if (m1.containsKey(s))
                    ans[i++] = m1.get(s);
                else 
                    ans[i++] = m2.getOrDefault(s.replaceAll("[aeiou]", "#"), "");
            }
        } 
        return ans;
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章