【附可运行代码】剑指 Offer 12. 矩阵中的路径
立志用最少的代码做最高效的表达
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成
优化过程
1、定义成员变量(全局变量),避免回溯方法用二维数组做参数,占用大量内存。
2、灵活使用剪枝,具体见代码。
public class Solution {char[][] bo; // 数组boardchar[] wo; // 数组wordboolean[][] vis; // vis数组int next[][];int n, m;boolean flag = false;public boolean exist(char[][] board, String word) {// 特殊情况判断if(board.length == 0) return false;bo = board;wo = word.toCharArray();n = bo.length; m = bo[0].length;vis = new boolean[n][m];next = new int[][]{{1,0}, {-1,0}, {0,-1},{0,1}};for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(wo[0] == bo[i][j]) {vis[i][j] = true;dfs(i, j, 1);vis[i][j] = false;}// 每次搜索后都判断是否已经找到if(flag) return true;}}return false;}public void dfs(int x, int y, int k) {// 1、终止条件// k == len,终止// res 如果已经找到,则直接return(剪枝)if(k == wo.length || flag) {flag = true; return;}for(int d = 0; d < 4; d++) {int xx = x + next[d][0], yy = y + next[d][1];// 越界 or 被访问过 or 不匹配if(xx < 0 || yy < 0 || xx >= n || yy >= m || vis[xx][yy] || bo[xx][yy]!=wo[k]) continue;vis[xx][yy] = true;dfs(xx, yy, k+1);vis[xx][yy] = false;}}}
可运行代码
// 静态Solution
public class 剑指Offer12_矩阵中的路径 {public static class Solution {char[][] bo; // 数组boardchar[] wo; // 数组wordboolean[][] vis; // vis数组int next[][];int n, m;boolean flag = false;public boolean exist(char[][] board, String word) {// 特殊情况判断if(board.length == 0) return false;bo = board;wo = word.toCharArray();n = bo.length; m = bo[0].length;vis = new boolean[n][m];next = new int[][]{{1,0}, {-1,0}, {0,-1},{0,1}};for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(wo[0] == bo[i][j]) {vis[i][j] = true;dfs(i, j, 1);vis[i][j] = false;}// 每次搜索后都判断是否已经找到if(flag) return true;}}return false;}public void dfs(int x, int y, int k) {// 1、终止条件// k == len,终止// res 如果已经找到,则直接return(剪枝)if(k == wo.length || flag) {flag = true; return;}for(int d = 0; d < 4; d++) {int xx = x + next[d][0], yy = y + next[d][1];// 越界 or 被访问过 or 不匹配if(xx < 0 || yy < 0 || xx >= n || yy >= m || vis[xx][yy] || bo[xx][yy]!=wo[k]) continue;vis[xx][yy] = true;dfs(xx, yy, k+1);vis[xx][yy] = false;}}}public static void main(String[] args) {Solution solution = new Solution();char[][] board = {{'a','b','c','e'},{'s','f','c','s'},{'a','d','e','e'}};String word = "abcced";System.out.println(solution.exist(board, word));}
}
【附可运行代码】剑指 Offer 12. 矩阵中的路径相关推荐
- 【算法】剑指 Offer 12. 矩阵中的路径
文章目录 1.概述 2.我的算法 2.1 棋盘 2.1 开始节点 2.2 点没被访问 2.3 点是否在棋盘内 2.4 下一步 2.5 主方法 2.6 核心方法 2.7 测试类 3.leecode1 1 ...
- 剑指offer——12.矩阵中的路径(不熟)
题目: 题1:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...
- 剑指 Offer 12. 矩阵中的路径
这里使用了回溯算法,回溯算法是一种比较特别的DFS,它需要在达到搜索条件后,回溯上一次,继续搜索.普通的DFS适合找路径是否存在的问题,而回溯算法适合解决有几条路径的问题. 这里给出DFS的模板 df ...
- 剑指Offer 12—矩阵中的路径
题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元 ...
- 【LeetCode笔记】79. 单词搜索 剑指 Offer 12 矩阵中的路径(Java、dfs)
文章目录 题目描述 思路 & 代码 更新版 2.0 题目描述 一眼dfs,走四个方向即可 思路 & 代码 class Solution {boolean[][] visited;boo ...
- 剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径
文章目录 同步GitHub在此
- LeetCode-剑指 Offer 12. 矩阵中的路径
剑指 Offer 12. 矩阵中的路径 思路一:DFS+回溯 DFS 解析: 递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k . 终止条件: ...
- 《剑指offer》——矩阵中的路径
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~ T: 题目描述 请设计一个函数,用来判断在一个矩阵中是否 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /*请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...
最新文章
- Android--混淆打包找不到资源类的…
- 建模matlab的算法代码呀,数学建模算法打包
- linux找不到动态链接库 .so文件的解决方法(转自:http://www.cnblogs.com/xudong-bupt/p/3698294.html)
- 1个月教你学会用Python实现机器学习
- 【HihoCoder - 1881】特殊任务 (树形图,遍历)
- Spring Boot + Log4j2 日志框架配置 (Maven)
- 导航卫星系统行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 再学Android之屏幕适配
- 【转载】一文读懂MCMC算法原理
- 智慧校园供水系统智能管理
- Not authorized , ReasonPhrase:Unauthorized
- message from server: “Host is not allowed to connect to this MySQL server“问题的解决办法
- 使用git push没有报错,但是远程仓库没有更新的问题
- 机器学习之路一:线性模型、非线性模型、神经网络
- android打包时出现***is not translated in zh-rCN (Chinese: China)
- Android apk瘦身
- 蓝奏云分享链接打不开的问题解决
- 如何计算字符串的字节长度
- python3中使用requests库出现的编码问题
- 在vue里使用reset.css