立志用最少的代码做最高效的表达


给定一个 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. 矩阵中的路径相关推荐

  1. 【算法】剑指 Offer 12. 矩阵中的路径

    文章目录 1.概述 2.我的算法 2.1 棋盘 2.1 开始节点 2.2 点没被访问 2.3 点是否在棋盘内 2.4 下一步 2.5 主方法 2.6 核心方法 2.7 测试类 3.leecode1 1 ...

  2. 剑指offer——12.矩阵中的路径(不熟)

    题目: 题1:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

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

    这里使用了回溯算法,回溯算法是一种比较特别的DFS,它需要在达到搜索条件后,回溯上一次,继续搜索.普通的DFS适合找路径是否存在的问题,而回溯算法适合解决有几条路径的问题. 这里给出DFS的模板 df ...

  4. 剑指Offer 12—矩阵中的路径

    题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元 ...

  5. 【LeetCode笔记】79. 单词搜索 剑指 Offer 12 矩阵中的路径(Java、dfs)

    文章目录 题目描述 思路 & 代码 更新版 2.0 题目描述 一眼dfs,走四个方向即可 思路 & 代码 class Solution {boolean[][] visited;boo ...

  6. 剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

    文章目录 同步GitHub在此

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

    剑指 Offer 12. 矩阵中的路径 思路一:DFS+回溯 DFS 解析: 递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k . 终止条件: ...

  8. 《剑指offer》——矩阵中的路径

    更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~ T: 题目描述 请设计一个函数,用来判断在一个矩阵中是否 ...

  9. 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述 /*请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...

最新文章

  1. Android--混淆打包找不到资源类的…
  2. 建模matlab的算法代码呀,数学建模算法打包
  3. linux找不到动态链接库 .so文件的解决方法(转自:http://www.cnblogs.com/xudong-bupt/p/3698294.html)
  4. 1个月教你学会用Python实现机器学习
  5. 【HihoCoder - 1881】特殊任务 (树形图,遍历)
  6. Spring Boot + Log4j2 日志框架配置 (Maven)
  7. 导航卫星系统行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. 再学Android之屏幕适配
  9. 【转载】一文读懂MCMC算法原理
  10. 智慧校园供水系统智能管理
  11. Not authorized , ReasonPhrase:Unauthorized
  12. message from server: “Host is not allowed to connect to this MySQL server“问题的解决办法
  13. 使用git push没有报错,但是远程仓库没有更新的问题
  14. 机器学习之路一:线性模型、非线性模型、神经网络
  15. android打包时出现***is not translated in zh-rCN (Chinese: China)
  16. Android apk瘦身
  17. 蓝奏云分享链接打不开的问题解决
  18. 如何计算字符串的字节长度
  19. python3中使用requests库出现的编码问题
  20. 在vue里使用reset.css

热门文章

  1. So Hot ?快给 CPU 降降温!
  2. 面试官:你对MySQL高性能优化有什么规范建议?
  3. OS- -I/O之盘和时钟
  4. 对话MPEG创始人Leonardo Chiariglione: MPEG精神将在MPAI中延续
  5. 【线上分享】下一代互联网通讯协议:QUIC
  6. Hotstar赛事直播编码组合优化
  7. 腾讯云EMR基于YARN针对云原生容器化的优化与实践
  8. 大牛书单 | 系统架构方向好书推荐
  9. 为什么虚拟机的linux系统IP是10.0.2.15
  10. TensorFlow文件操作