[Lintcode]132. Word Search II /[Leetcode]212. Word Search II

132. Word Search II / 212. Word Search II

  • 本题难度: Hard
  • Topic: Data Structure - Tire/DFS

Description

Given a 2D board and a list of words from the dictionary, find all words in the board.

Each word must be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

Example:

Input:
words = [“oath”,“pea”,“eat”,“rain”] and board =
[
[‘o’,‘a’,‘a’,‘n’],
[‘e’,‘t’,‘a’,‘e’],
[‘i’,‘h’,‘k’,‘r’],
[‘i’,‘f’,‘l’,‘v’]
]

Output: [“eat”,“oath”]

别人的代码

class Solution:
    #def findWords(self, board: 'List[List[str]]', words: 'List[str]') -> 'List[str]':
    def findWords(self, board, words):
        trie = {}
        for w in words:
            t = trie
            for c in w:
                if c not in t:
                    t[c] = {}
                t = t[c]
            t['#'] = '#'
        res = []
        for i in range(len(board)):
            for j in range(len(board[0])):
                self.find(board, i, j, trie, '', res)
        return list(set(res))

    def find(self, board, i, j, trie, path, res):
        if '#' in trie:
            res.append(path)
        if i<0 or i>=len(board) or j<0 or j>=len(board[0]) or board[i][j] not in trie:
            return
        tmp = board[i][j]
        board[i][j] ="@"
        self.find(board, i+1, j, trie[tmp], path+tmp, res)
        self.find(board, i, j+1, trie[tmp], path+tmp, res)
        self.find(board, i-1, j, trie[tmp], path+tmp, res)
        self.find(board, i, j-1, trie[tmp], path+tmp, res)
        board[i][j] = tmp

思路
79. Word Search的升级版。不仅仅用了DFS还用Tire进行了优化。使得查找各个单词时不用依次从头到尾查找,而是共用了前缀。
因为之前没有写过Tire,所以我选择看一看discussion。

字典树

https://blog.csdn.net/chivalrousli/article/details/41487953

Trie的过程

构建一个字典树的方法代码

words = ["oath","pea","eat","rain","peakja","peal"]

trie = {} #4339361904
for w in words:
    #print(trie)
    t = trie  #4339361904
    #print(id(t),id(trie))
    for c in w:
        if c not in t: #不存在相同前缀的单词已在字典树
            t[c] = {} #t:4339361904 #t[c]: 4339361976
        print(id(t),t)
        t = t[c] #t:4339361976
        print(id(t),t)
        print("*****")
    t['#'] = '#'
print(id(trie))

trie 和初始的t在4339361904:
字典t中key为c的val:{}存储在4339361976中,然后将t指向t[c]的位置,相当于t得到了更新。
tire有点像链表的表头。
【Python】变量类型、变量名、内存地址

  • 时间复杂度
    使用trie 对有相同前缀的单词有优化,但是时间复杂度没变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值