拼寫糾正系列
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