LeetCode212 單詞搜尋 II

2022-08-11 09:03:14 字數 1472 閱讀 1615

這題是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...