前缀树、字典树、Trie | 回溯 :力扣212. 单词搜索 II

本文介绍了一种结合字典树(Trie)与回溯算法解决单词搜索问题的方法。通过构建字典树预处理单词集,利用回溯算法在矩阵中查找所有可能的单词,实现了高效地单词搜索。文章详细解析了算法流程与Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述:

困难
在这里插入图片描述

实现Trie(前缀树)

2、题解:

方法:字典树 + 回溯

算法流程:
根据字典中的单词构建一个Trie,稍后将用于匹配过程
从每个单元开始,如果字典中存在以单元格开头的单词,就开始回溯
在递归函数调用中,探索当前的单元格周围的相邻单元格以进行下一次递归调用。在每次调用时,先检查当前遍历的
字母序列是否与字典中的任何单词匹配,这里就需要之前构建的Trie数组结构。

Python实现:

class Solution:
    def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
        #前缀树+回溯
        directions = [[1,0],[0,-1],[-1,0],[0,1]]
        #构建Trie
        trie = {}
        for word in words:
            t = trie
            for w in word:
                t = t.setdefault(w,{})
            t['end'] = 1
        #回溯
        def dfs(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 directions:
                newx,newy = x + i,y + j
                if 0 <= newx < row and 0 <= newy < col and board[newx][newy] != '#':
                    dfs(newx,newy,trie,s+c)
            board[i][j] = c
        res = []
        row,col = len(board),len(board[0])
        for i in range(row):
            for j in range(col):
                dfs(i,j,trie,'')
        return res

3、复杂度分析:

详细分析见:https://leetcode-cn.com/problems/word-search-ii/solution/dan-ci-sou-suo-ii-by-leetcode/
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值