单词搜索 II(python)

题目描述

题目链接

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例1:

输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]

解题思路

  1. 构建字典树Trie,将words中的词全部插入到Trie中。
  2. 深度优先搜索,遍历board,搜索Trie

代码

class Solution:
    def findWords(self, board, words):
        trie = {}
        for c in words:
            tree = trie
            for i in c:
                tree = tree.setdefault(i, {})
            tree['#'] = '#'
        res = set()
        m, n = len(board), len(board[0])
        def dfs(i, j, prev, tree, seen):
            if '#' in tree:
                res.add(prev)
            for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
                new_i, new_j = i+di, j+dj
                if 0 <= new_i < m and 0 <= new_j < n and (new_i, new_j) not in seen and board[new_i][new_j] in tree:
                    dfs(new_i, new_j, prev+board[new_i][new_j], tree[board[new_i][new_j]], seen|{(new_i, new_j)})
        for i in range(m):
            for j in range(n):
                if board[i][j] in trie:
                    dfs(i, j, board[i][j], trie[board[i][j]], {(i, j)})
        return list(res)

时间复杂度分析

假设m, n分别是board的行数和列数,L为单词的最大长度,则时间复杂度为O(m×n×4×(3^(L-1)))

其中,m*n是两层for循环的时间复杂度,4×3^(L-1)是dfs的时间复杂度,最初(第一步)有四个方向可以搜索(最坏情况),但在接下来的搜索中,只有三个方向可以搜索(不包括从上一步来的方向),即4×3^(L-1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值