這題是leetcode79. 單詞搜尋的高階版,第79題是在二維的char陣列裡搜尋單個單詞,
這題需要在二維char陣列裡搜尋一組單詞。
理論上只需要對遍歷單詞陣列,逐個套用79的dfs方法即可,不過這題題目要求了需要用trie樹做優化。
所以,我們最開始可以把單詞列表裡的所有單詞都插入到乙個trie樹中,然後對單詞做搜尋的時候,除了檢查下乙個位置的字母不越界且未使用過(題目要求
同乙個單元格內的字母不允許被重複使用)以外,還需要檢查下乙個位置的字母是否是當前字母在trie樹的孩子。
通過這個額外的trie樹的剪枝,可以減小搜尋空間。
有幾點需要注意:
(1)trie樹儲存每個單詞的時候,需要在每個單詞的結尾字母打乙個標記,我們用乙個整數變數id來確定當前字母是第id個字母(id從0開始)的結尾。
id就是單詞在words列表中的順序。 我們在dfs的時候,成功搜尋到單詞的標誌就是最終的指標指向的字母的id不為-1(建構函式中對id初始賦值為-1)。
(2)我們可能會在char陣列中多次搜尋到同樣的單詞,所以需要額外用乙個雜湊表unordered_set來對dfs函式搜尋到的單詞的id進行記錄。
(3)我們把二維char陣列board記錄到乙個全域性二維char變數g中,並用全域性變數rows和cols記錄二維陣列的行數和列數,這樣dfs函式可以少傳幾個引數。
**如下:
class solution , dy[4] = ; //g的行數、列數、dfs的四個方向
unordered_setids; //用來去重
struct node
}}*root;
void insert(string &word, int id)
p = p -> son[u];
}p -> id = id;
}void dfs(int x, int y, node *p)
char temp = g[x][y]; //題目要求同乙個單元格內的字母在乙個單詞中不允許被重複使用,所以我們先記錄下這個位置的字元,然後暫時將他修改為'.',表示不可用,dfs之後再恢復現場
g[x][y] = '.';
for(int i = 0; i < 4; ++i)
}g[x][y] = temp; //恢復現場,把這個位置的字母從'.'恢復到它本來的樣子
}vectorfindwords(vector>& board, vector& words)
for(int i = 0; i < rows; ++i) }}
for(auto id : ids)
return res;}};
leetcode 212 單詞搜尋II
題目 我的思路 使用回溯,重要是剪枝,這點可以讓程式不用花太多時間做無用功。我的解答 class solution for int i 0 i position.size i used new int board.length board 0 length used x y 0 已被使用 retur...
LeetCode212 單詞搜尋 II
題目描述 給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oat...
212 單詞搜尋 II
給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oath pea...