[LeetCode] 212. 單詞搜索 II

題目連接: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

421. 數組中兩個數的最大異或值

代碼:

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
相關文章
相關標籤/搜索