單詞拼寫糾正-05-2452.力扣 距離字典兩次編輯距離以內的單詞

老马啸西风發表於2024-12-09

拼寫糾正系列

NLP 中文拼寫檢測實現思路

NLP 中文拼寫檢測糾正演算法整理

NLP 英文拼寫演算法,如果提升 100W 倍的效能?

NLP 中文拼寫檢測糾正 Paper

java 實現中英文拼寫檢查和錯誤糾正?可我只會寫 CRUD 啊!

一個提升英文單詞拼寫檢測效能 1000 倍的演算法?

單詞拼寫糾正-03-leetcode edit-distance 72.力扣編輯距離

開源專案

nlp-hanzi-similar 漢字相似度

word-checker 拼寫檢測

sensitive-word 敏感詞

題目

給你兩個字串陣列 queries 和 dictionary 。

陣列中所有單詞都只包含小寫英文字母,且長度都相同。

一次 編輯 中,你可以從 queries 中選擇一個單詞,將任意一個字母修改成任何其他字母。

從 queries 中找到所有滿足以下條件的字串:不超過 兩次編輯內,字串與 dictionary 中某個字串相同。

請你返回 queries 中的單詞列表,這些單詞距離 dictionary 中的單詞 編輯次數 不超過 兩次 。

單詞返回的順序需要與 queries 中原本順序相同。

示例 1:

輸入:queries = ["word","note","ants","wood"], dictionary = ["wood","joke","moat"]
輸出:["word","note","wood"]
解釋:
- 將 "word" 中的 'r' 換成 'o' ,得到 dictionary 中的單詞 "wood" 。
- 將 "note" 中的 'n' 換成 'j' 且將 't' 換成 'k' ,得到 "joke" 。
- "ants" 需要超過 2 次編輯才能得到 dictionary 中的單詞。
- "wood" 不需要修改(0 次編輯),就得到 dictionary 中相同的單詞。
所以我們返回 ["word","note","wood"] 。

示例 2:

輸入:queries = ["yes"], dictionary = ["not"]
輸出:[]
解釋:
"yes" 需要超過 2 次編輯才能得到 "not" 。
所以我們返回空陣列。

提示:

1 <= queries.length, dictionary.length <= 100

n == queries[i].length == dictionary[j].length

1 <= n <= 100

所有 queries[i] 和 dictionary[j] 都只包含小寫英文字母。

方法模板

public List<String> twoEditWords(String[] queries, String[] dictionary) {
    //...
}

v1-暴力演算法

思路

我們不做任何最佳化,首先實現判斷一個單詞是否可以透過 2 次編輯調整為結果中的值。

這一題其實題目的難度進行了一定長度的降低。

可以參考 T161 和 T72,是 T161 的簡化版本,因為我們只需要考慮替換的場景。

核心思路

這裡只允許 replace,所以長度必須相同。

然後遍歷,發現不同的長度為小於等於 2 即可。

實現

public List<String> twoEditWords(String[] queries, String[] dictionary) {
    List<String> list = new ArrayList<>();
    for(String query : queries) {
        if(isTwoEditWords(query, dictionary)) {
            list.add(query);
        }
    }
    return list;
}

private boolean isTwoEditWords(final String query,
                               String[] dictionary) {
    for(String dict : dictionary) {
        if(isTwoEditWords(query, dict)) {
            return true;
        }
    }
    return false;
}

private boolean isTwoEditWords(String word, String dict) {
    if(word.length() != dict.length()) {
        return false;
    }
    int differCount = 0;
    char[] ss = word.toCharArray();
    char[] ts = dict.toCharArray();
    for(int i = 0; i < ss.length; i++) {
        if(ss[i] != ts[i]) {
            differCount++;
        }
    }
    return differCount <= 2;
}

效果

17ms 擊敗 8.70%

v2-改進版本

思路

針對兩個單詞的判斷,加一個快速失敗。

實現

private boolean isTwoEditWords(String word, String dict) {
    if(word.length() != dict.length()) {
        return false;
    }
    int differCount = 0;
    char[] ss = word.toCharArray();
    char[] ts = dict.toCharArray();
    for(int i = 0; i < ss.length; i++) {
        if(ss[i] != ts[i]) {
            differCount++;
        }
        if(differCount > 2) {
            return false;
        }
    }
    return true;
}

效果

10ms 擊敗34.78%

小結

看了一下這一題的測試用例設計不是很長,所以區分度不高。

排名比較高的也是這個演算法,暫時不做深入研究。

這一題個人理解其實可以作為 T72 的鋪墊,因為比 T72 簡單多了。

我是老馬,期待與你的下次重逢。

開源專案

單詞拼寫對應的開源專案如下,歡迎 fork + star!

https://github.com/houbb/word-checker

相關文章