單詞拼寫糾正-04-161.力扣 相隔為 1 的編輯距離

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

拼寫糾正系列

NLP 中文拼寫檢測實現思路

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

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

NLP 中文拼寫檢測糾正 Paper

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

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

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

開源專案

nlp-hanzi-similar 漢字相似度

word-checker 拼寫檢測

sensitive-word 敏感詞

題目

給定兩個字串 s 和 t ,如果它們的編輯距離為 1 ,則返回 true ,否則返回 false 。

字串 s 和字串 t 之間滿足編輯距離等於 1 有三種可能的情形:

  • 往 s 中插入 恰好一個 字元得到 t

  • 從 s 中刪除 恰好一個 字元得到 t

  • 在 s 中用 一個不同的字元 替換 恰好一個 字元得到 t

示例 1:

輸入: s = "ab", t = "acb"
輸出: true
解釋: 可以將 'c' 插入字串 s 來得到 t。
示例 2:

輸入: s = "cab", t = "ad"
輸出: false
解釋: 無法透過 1 步操作使 s 變為 t。

提示:

0 <= s.length, t.length <= 104
s 和 t 由小寫字母,大寫字母和數字組成

方法模板

public boolean isOneEditDistance(String s, String t) {
    // 模板        
}

基本思路

思路

拆分為3個場景:

  1. 如果二者長度差大於1,直接不可能

  2. 如果二者長度相同,那麼只能有一個差異,則可以透過 replace 來實現。

  3. 如果長度差為1,那麼可以透過 delete/insert 來實現。

可以簡化為,透過長的-1來實現。

具體方法是,比較 s 和 t,找到第一個不同的字元後,跳過其中一個字元,繼續比較剩下的部分。如果剩下的部分相等,則返回 true,否則返回 false。

實現

    public static boolean isOneEditDistance(String s, String t) {
        // 模板
        int sLen = s.length();
        int tLen = t.length();

        if(Math.abs(sLen - tLen) > 1) {
            return false;
        }

        // 如果長度相同
        char[] sChars = s.toCharArray();
        char[] tChars = t.toCharArray();
        if(sLen == tLen) {
            int diffCount = 0;
            for(int i = 0; i < sLen; i++) {
                if(sChars[i] != tChars[i]) {
                    diffCount++;
                }
            }

            return diffCount == 1;
        }

        // 如果長度差為 1,檢查是否能透過插入或刪除一個字元使兩個字串相等
        if (s.length() > t.length()) {
            // 確保 s 是較短的字串
            String temp = s;
            s = t;
            t = temp;
        }
        // 嘗試在 s 中插入一個字元變成 t
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != t.charAt(i)) {
                // 跳過 t 中當前字元,繼續比較
                return s.substring(i).equals(t.substring(i + 1));
            }
        }
        // 如果 s 完全是 t 的字首,說明只差一個字元
        return s.length() + 1 == t.length();
    }    

小結

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

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

開源專案

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

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

參考資料

edit-distance-1.html

Peter Norvig: How to Write a Spelling Corrector.

相關文章