发布于 

剑指 Offer.12-矩阵中的路径

剑指 Offer.12-矩阵中的路径

题目链接

<剑指 Offer 12. 矩阵中的路径>

问题描述

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

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

个人想法

图的深度优先搜索 + 回溯

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
//由于当前题目需要搜索的空间为图 初始节点可能不是左上的节点 需要对全图进行搜索
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(dfs(board, words, i, j, 0)) return true;
}
}
return false;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
// 边界判断 合法性判断
if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
// 当所有字母均在此次深度优先搜索中被找到 返回true
if(k == word.length - 1) return true;
// 当走过1个字母时,将其值修改为空格 防止重复搜索
board[i][j] = '\0';
// 向4个方向进行深度优先搜索 通过||实现剪枝
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
// 搜索完成后 重新将值赋值回来 复原现场
board[i][j] = word[k];、
// 返回结果
return res;
}
}

注意点

本体中使用栈 + 迭代模拟递归,需要想办法记录四个方向的遍历顺序,否则会进入死循环


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。