拼寫糾正系列
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,直接不可能
-
如果二者長度相同,那麼只能有一個差異,則可以透過 replace 來實現。
-
如果長度差為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.