【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径

简介: Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。

1 题目

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

示例 1:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true

示例 3:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false

提示:

m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2 解析

使用回溯算法
设函数 check(i,j,k) 表示判断以网格的 (i, j)位置出发,能否搜索到单词word[k…],其中 word[k…] 表示字符串word 从第 k 个字符开始的后缀子串。如果能搜索到,则返回true,反之返回 false。函数 check(i,j,k) 的执行步骤如下:

  • 如果 board [ i ] [ j ] ≠ s [ k ] \textit{board}[i][j] \neq s[k] board[i][j]\=s[k],当前字符不匹配,直接返回 False。
  • 如果当前已经访问到字符串的末尾,且对应字符依然匹配,此时直接返回 True。
  • 否则,遍历当前位置的所有相邻位置。如果从某个相邻位置出发,能够搜索到子串 word[k+1…],则返回True,否则返回False。
    这样,我们对每一个位置(i,j) 都调用函数 check(i,j,0) 进行检查:只要有一处返回 True,就说明网格中能够找到相应的单词,否则说明不能找到。

为了防止重复遍历相同的位置,需要额外维护一个与 board 等大的visited 数组,用于标识每个位置是否被访问过。每次遍历相邻位置时,需要跳过已经被访问的位置。

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/word-search/solution/dan-ci-sou-suo-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3 python实现

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:

        direction = [(0,1),(0,-1),(1,0),(-1,0)]
        visited = set()
        def check(i,j,k):
            if board[i][j]!=word[k]:
                return False
            if len(word)-1==k:
                return True

            visited.add((i,j))
            res = False
            for di,dj in direction:
                x,y = di+i,dj+j
                if 0<=x<len(board) and 0<=y<len(board[0]):
                    if (x,y) not in visited:
                        if check(x,y,k+1):
                            res =  True
                            break
            # 回溯
            visited.remove((i,j))
            return res

        for i in range(len(board)):
            for j in range(len(board[0])):
                if check(i,j,0):
                    return True

        return False
目录
相关文章
|
15天前
|
测试技术 API 开发者
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
|
2月前
|
数据采集 Web App开发 JavaScript
无头浏览器技术:Python爬虫如何精准模拟搜索点击
无头浏览器技术:Python爬虫如何精准模拟搜索点击
|
7月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
237 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
4月前
|
算法 Go
【LeetCode 热题100】73:矩阵置零(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 73——矩阵置零问题,提供两种解法:一是使用额外标记数组,时间复杂度为 O(m * n),空间复杂度为 O(m + n);二是优化后的原地标记方法,利用矩阵的第一行和第一列记录需要置零的信息,将空间复杂度降低到 O(1)。文章通过清晰的代码示例与复杂度分析,帮助理解“原地操作”及空间优化技巧,并推荐相关练习题以巩固矩阵操作能力。适合刷题提升算法思维!
108 9
|
5月前
|
机器学习/深度学习 自然语言处理 TensorFlow
使用Python和DeepSeek进行联网搜索的实践指南
本文介绍如何使用Python和假设的高性能深度学习工具包DeepSeek进行联网搜索,并通过实际案例展示其应用过程。首先,准备环境并安装依赖库(如Python 3.x、pip、DeepSeek、requests和BeautifulSoup4)。接着,讲解了DeepSeek的功能及其在图像分类、实体识别等任务中的应用。通过联网搜索抓取数据并进行预处理后,使用TensorFlow和Keras构建和训练CNN模型。
506 3
|
12月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
9月前
|
Python
二分查找变种大赏!Python 中那些让你效率翻倍的搜索绝技!
二分查找是一种高效的搜索算法,适用于有序数组。其基本原理是通过不断比较中间元素来缩小搜索范围,从而快速找到目标值。常见的变种包括查找第一个等于目标值的元素、最后一个等于目标值的元素、第一个大于等于目标值的元素等。这些变种在实际应用中能够显著提高搜索效率,适用于各种复杂场景。
103 9
|
9月前
|
算法 数据处理 开发者
超越传统:Python二分查找的变种策略,让搜索效率再上新台阶!
本文介绍了二分查找及其几种Python实现的变种策略,包括经典二分查找、查找第一个等于给定值的元素、查找最后一个等于给定值的元素以及旋转有序数组的搜索。通过调整搜索条件和边界处理,这些变种策略能够适应更复杂的搜索场景,提升搜索效率和应用灵活性。
82 5
|
10月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
99 3
|
10月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
87 0

热门文章

最新文章

推荐镜像

更多