图解LeetCode——剑指 Offer 12. 矩阵中的路径

简介: 图解LeetCode——剑指 Offer 12. 矩阵中的路径

一、题目

  • 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false
  • 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
  • 例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

二、示例

2.1> 示例 1:

【输入】board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"

【输出】true

2.2> 示例 2:

【输入】board = [["a","b"],["c","d"]], word = "abcd"

【输出】false

提示:

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

三、解题思路

  • 根据题目描述,我们需要在矩阵board中找到是否存在字符串单词word,那么我们第1个步骤要做的事情就是寻找单词word的第一个字符在board中的位置。然后再以这个字符作为起点去匹配word中的其他字符。
  • 在这个对比过程中,我们会执行一些“错误的路径”。以下图为例,输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE";word的第1个字符是‘S’,那么我们会找到第2行第1列的‘S’,那么我们无论从它相邻的都无法找到word的第2个字符‘E’,那么这个就是一条“错误的路径”。分析到这里,我们就很容易想到大致的解题思路就是——回溯。通过回溯我们才能从错误的路径中跳脱出来,继续去寻找矩阵board中的下一个字符‘S’,那么后续我们在第2行第4列找到了‘S’,然后发现可以找到一条“正确的路径”,就可以返回结果为true。

  • 除了上面分析的内容之后,我们还需要注意一点,就是过滤后的格子我们不能重复经过,所以,每当我们经过某个格子(例如:rowcol列)之后,可以暂时将其设置一个特殊值(例如:bc[row][col] = '\0'),那么如果发现是错误的路径,可以再将经过的格子值还原回去就可以了。
  • 上面就是解题思路了,还是按照惯例,我们以输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"为例,看一下具体的寻路历程:

四、代码实现

classSolution {
char[] wc; char[][] bc; intn, m;
publicbooleanexist(char[][] board, Stringword) {
wc=word.toCharArray();
bc=board;
n=board.length;
m=board[0].length;
for (inti=0; i<n; i++) 
for (intj=0; j<m; j++) 
if (search(i, j, 0)) returntrue;
returnfalse;
    }
publicbooleansearch(introw, intcol, intindex) {
if (index==wc.length) returntrue;
if (row<0||row>=n||col<0||col>=m) returnfalse;     
if (bc[row][col] !=wc[index]) returnfalse;
bc[row][col] ='\0'; // 标记已匹配booleanresult=search(row-1, col, index+1) ||// 上search(row+1, col, index+1) ||// 下search(row, col-1, index+1) ||// 左search(row, col+1, index+1); // 右bc[row][col] =wc[index]; // 回溯原值returnresult;
    }
}


今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
21天前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
21 0
|
21天前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
26 0
|
3月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
21天前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
11 0
|
22天前
|
算法 C++
Leetcode第59题(螺旋矩阵2)
这篇文章介绍了解决LeetCode第59题“螺旋矩阵II”的算法,通过C++编程实现按顺时针顺序填充一个n x n的正方形矩阵。
14 0
|
3月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
3月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
49 6
|
3月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
21 3