題目連接:https://leetcode-cn.com/problems/word-search-ii/python
給定一個二維網格 board 和一個字典中的單詞列表 words,找出全部同時在二維網格和字典中出現的單詞。數組
單詞必須按照字母順序,經過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母在一個單詞中不容許被重複使用。數據結構
輸入: words = ["oath","pea","eat","rain"] and board = [ ['o','a','a','n'], ['e','t','a','e'], ['i','h','k','r'], ['i','f','l','v'] ] 輸出: ["eat","oath"]
前綴樹(字典樹)app
先作一下前綴樹的數據結構208. 實現 Trie (前綴樹) | 題解連接spa
咱們把全部單詞構形成前綴樹code
再遍歷 board
用DFS分別在前綴樹上跑leetcode
有不清楚的地方, 歡迎留言~get
相關題型:io
212. 單詞搜索 IIclass
class Solution: def findWords(self, board: List[List[str]], words: List[str]) -> List[str]: trie = {} for word in words: t = trie for w in word: t = t.setdefault(w, {}) t["end"] = 1 #print(trie) res = [] row = len(board) col = len(board[0]) def dfs(i, j, trie, s): #print(i, j, trie, s) c = board[i][j] if c not in trie: return trie = trie[c] if "end" in trie and trie["end"] == 1: res.append(s + c) trie["end"] = 0 # 防止重複數組加入 board[i][j] = "#" for x, y in [[-1, 0], [1, 0], [0, 1], [0, -1]]: tmp_i = x + i tmp_j = y + j if 0 <= tmp_i < row and 0 <= tmp_j < col and board[tmp_i][tmp_j] != "#": dfs(tmp_i, tmp_j, trie, s + c) board[i][j] = c for i in range(row): for j in range(col): dfs(i, j, trie, "") return res