[剑指offer][JAVA]面试题第[12]题[矩阵的路径][DFS][剪枝]

【问题描述】[中等]

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。示例 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

【解答思路】

DFS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度
在这里插入图片描述

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;if(k == word.length - 1) return true;char tmp = board[i][j];board[i][j] = '/';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] = tmp;return res;}
}

归搜索匹配字符串过程中,需要 board[i][j] = ‘/’ 来防止 ”走回头路“ 。当匹配字符串不成功时,会回溯返回,此时需要board[i][j] = tmp 来”取消对此单元格的标记”。 在DFS过程中,每个单元格会多次被访问的, board[i][j] = '/'只是要保证在当前匹配方案中不要走回头路。
一层一层向下递归来进行字符串匹配的,回溯的时候要“释放“这个单元格。匹配失败或者成功都会执行 board[i][j] = tmp
匹配成功也需要将 True 结果一层一层返回,直至起始点,以获取匹配成功的结果

class Solution {private int[][] direct = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};private boolean[][] visited;public boolean exist(char[][] board, String word) {char[] words = word.toCharArray();int row = board.length;int col = board[0].length;this.visited = new boolean[row][col];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (dfs(board, i, j, words, 0)) {return true;}}}return false;}private boolean dfs(char[][] board, int x, int y, char[] word, int index) {if (board[x][y] == word[index]) {if (index + 1 == word.length) {return true;}visited[x][y] = true;for (int i = 0; i < 4; i++) {int newX = x + direct[i][0];int newY = y + direct[i][1];if (inArea(newX, newY, board.length, board[0].length) && !visited[newX][newY]) {if (dfs(board, newX, newY, word, index + 1)) {return true;}}}visited[x][y] = false;}return false;}private boolean inArea(int x, int y, int row, int col) {return x >= 0 && y >= 0 && x < row && y < col;}
}

【总结】

1.细节

1.1 方向数组
private int[][] direct = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
1.2 char[] words = word.toCharArray(); 替代Sting.charAt()(charAt每次都要检查边界)
1.3 边界判定
private boolean inArea(int x, int y, int row, int col) {
return x >= 0 && y >= 0 && x < row && y < col;
}
}

2.回溯 遍历时对原结果有影响 在dfs递归前后置状态-恢复状态
 visited[x][y] = true;dfsvisited[x][y] = false;
3. 算法原理:

深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成功 的情况(例如:此矩阵元素和目标字符不同、此元素已被访问),则应立即返回,称之为 可行性剪枝 。

转载链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记2——常用类

目录1 内部类1.1 成员内部类1.2 静态内部类1.3 局部内部类1.4 匿名内部类2 Object类2.1 getClass()方法2.2 hashCode()方法2.3 toSring()方法2.4 equals()方法2.5 finalize()方法3 包装类3.1 类型转换与装箱、拆箱3.2 整数缓冲区4 String类4.1 常用方法4.2 可变字符串5 BigDeci…

Mysql密码忘记了怎么办?

停止mysql&#xff1a; sudo /etc/init.d/MySQL stop(可能有其它的方法&#xff0c;总之停止MySQLd的运行就可以了) 修改mysql的配置文件&#xff1a; 在/etc/mysql/mysql.conf.d/mysqld.cnf文件中添加skip-grant-tables&#xff0c;每台电脑的文件位置可能不同。 重新启动mysq…

html:(31):层叠和重要性

层叠 我们来思考一个问题&#xff1a;如果在html文件中对于同一个元素可以有多个css样式存在并且这多个css样式具有相同权重值怎么办&#xff1f;好&#xff0c;这一小节中的层叠帮你解决这个问题。 层叠就是在html文件中对于同一个元素可以有多个css样式存在&#xff0c;当有…

架构设计分布式数据结构与算法面试题

目录架构设计请列举出在JDK中几个常用的设计模式&#xff1f;什么是设计模式&#xff1f;你是否在你的代码里面使用过任何设计模式&#xff1f;静态代理、JDK动态代理以及CGLIB动态代理静态代理动态代理cglib代理单例模式工厂模式观察者模式装饰器模式秒杀系统设计分布式分布式…

Java学习笔记3——集合框架

文章目录1 集合的概念2 Collection体系集合Collection父接口3 List接口与实现类List接口List实现类ArrayListVectorLinkedList4 Set接口与实现类Set接口Set实现类HashSetTreeSet5 Map接口与实现类Map接口Map接口的内部接口Entry1 集合的概念 概念&#xff1a;对象的容器&#…

CLOSE_WAIT状态的原因与解决方法

这个问题之前没有怎么留意过&#xff0c;是最近在面试过程中遇到的一个问题&#xff0c;面了两家公司&#xff0c;两家公司竟然都面到到了这个问题&#xff0c;不得不使我开始关注这个问题。说起CLOSE_WAIT状态&#xff0c;如果不知道的话&#xff0c;还是先瞧一下TCP的状态转移…

html:(32):字体,字号,颜色

文字排版--字体 我们可以使用css样式为网页中的文字设置字体、字号、颜色等样式属性。下面我们来看一个例子&#xff0c;下面代码实现&#xff1a;为网页中的文字设置字体为宋体。 body{font-family:"宋体";} 这里注意不要设置不常用的字体&#xff0c;因为如果用…

POJ-1845 数论

题意就是输入 a,b 输出 a的b次方的因子求和并对9902 取模 这题可以对因子化简 由于唯一分解定理 可以把a表示成 p1^q1*p2^q2...*pn^qn 也就是说 a^b p1^(q1*b)*p2^(q2*b)...*pn^(qn*b) 由于约数和公式可得a^b得约数求和为(1p1p1^2p1^3...p1^(q1*b))(1p2p2^2p2^3...p2^(q2*b…

html:(33):文字排版粗体和斜体

文字排版--粗体 我们还可以使用css样式来改变文字的样式&#xff1a;粗体、斜体、下划线、删除线&#xff0c;可以使用下面代码实现设置文字以粗体样式显示出来。 p span{font-weight:bold;} 在这里大家可以看到&#xff0c;如果想为文字设置粗体是有单独的css样式来实现的&…

[剑指offer][JAVA]面试题第[14-1、2]题[剪绳子][Leetcode][第343题][整数拆分][数学][动态规划][背包]

【问题描述】[中等] 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少&#xff1f;…

Java学习笔记4——I/O框架

目录1 流的概念2 流的分类3 字节流文件字节流FileInputStreamFileOutputStream字节缓冲流BufferedInputStreamBufferedOutputStream对象流ObjectOutputStreamObjectInputStream注意事项5 字符流文件字符流FileReaderFileWriter字符缓冲流BufferedReaderBufferedWriter转换流Inp…

snappy

参考From <https://dirtysalt.github.io/snappy.html> Snappy API From <https://www.npmjs.com/package/snappy> Snappy 是一个 C 的用来压缩和解压缩的开发包&#xff0c;其目标不是较大限度压缩&#xff0c;而且不兼容其他压缩格式。Snappy 旨在提供高速压缩速…

2017百度之星资格赛 1003 度度熊与邪恶大魔王

本题我们可以类比背包 背包dp[i][j] 表示再有i个物品下j个空间所获得的最大价值 本题dp[i][j] 可以表示干掉i个血量j个防御力下的最小花费 我们看其实我们就是在不同血量之间转移 如果当前技能的攻击力 > 当前防御力 如果攻击力能干掉怪物那么dp[i][j] min(花费,dp[…

html:(34):下划线和删除线

文字排版--下划线 有些情况下想为文字设置为下划线样式&#xff0c;这样可以在视觉上强调文字&#xff0c;可以使用下面代码来实现&#xff1a; p a{text-decoration:underline;}<p>三年级时&#xff0c;我还是一个<a>胆小如鼠</a>的小女孩。</p> &…

设计模式--职责链模式

实验15&#xff1a;职责链模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解职责链模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用职责链模式解决实际问题。 [实验任务]&#xff1a;财务审批 某物资管理系统…

uoj#188. 【UR #13】Sanrd(Min_25筛)

题面 传送门 题解 这是一道语文题 不难看出&#xff0c;题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程&#xff0c;设 \[S(n,j)\sum_{i1}^nsec_p(i)[min_p(i)\geq P_j]\] 用人话来说的话&#xff0c;就是\(S(n,j)\)表示\(1\)到\(n\)之间所有满足最…

[剑指offer]面试题第[66]题[构建乘积数组][Leetcode][JAVA][第238题][除自身以外数组的乘积][数组]

【问题描述】[中等] 给你一个长度为 n 的整数数组 nums&#xff0c;其中 n > 1&#xff0c;返回输出数组 output &#xff0c;其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4] 输出: [24,12,8,6]提示&#xff1a;题目数据保证数组之中任…

【发现问题】Java中PrintWriter和BufferedWriter的区别

BufferedWriter: 将文本写入字符输出流&#xff0c;缓冲各个字符从而提供单个字符&#xff0c;数组和字符串的高效写入。通过write()方法可以将获取到的字符输出&#xff0c;然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并…

玩转oracle 11g(47):oracle删除非空表空间

DROP TABLESPACE WIICARE INCLUDING CONTENTS AND DATAFILES; --wiicare表空间名

【发现问题】Java中PrintStream和PrintWriter的区别

PrintStream和PrintWriter的API几乎相同&#xff0c;都能输出各种形式的数据&#xff0c;构造方法也几乎相同。两者有何区别&#xff1f; **2个类的功能基本相同&#xff0c;PrintStream能做的PrintWriter也都能实现&#xff0c;并且PrintWriter的功能更为强大。**但是由于Pri…