力扣 - 剑指 Offer 12. 矩阵中的路径
题目
思路1(回溯、DFS)
- 这题可以使用回溯+递归来解决,思路如下:
- 将二维数组的每一个元素都作为起点进行回溯查找
- 每次查找的时候,都有四个方向,但是上一个方向不能再次被遍历,因此需要将遍历过的位置进行做标记,递归返回的时候再还原
- 递归过程中要判断一些条件:越界直接返回false、当前字符和
word中的不匹配也直接返回false - 何时为匹配成功呢?只要能匹配到
word的最后一个字符,即curIndex == cs.length-1(curIndex为每次搜索的深度,不过是从0开始的,就是在word中的位置;cs.length-1为最后一个字符的索引位置),因此后面剩下的就不用查找了
代码
class Solution {
public boolean exist(char[][] board, String word) {
char[] cs = word.toCharArray();
// 遍历整个二维数组,即将每个字符作为第一个字符进行尝试
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
// 只要有一条符合条件,则返回true
if (dfs(board, cs, i, j, 0)) {
return true;
}
}
}
// 没找到
return false;
}
public boolean dfs(char[][] board, char[] cs, int i, int j, int curIndex) {
// 超过二维数组边界就返回false
// 字符不匹配也直接结束递归
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != cs[curIndex]) {
return false;
}
// 如果以及全部匹配到了,就直接返回true,而不用继续匹配剩下的啦
if (curIndex == cs.length - 1) {
return true;
}
// 能递归到这里,说明当前cs中curIndex索引对应的字符和boards是匹配的
// 因此我们需要吧遍历过的字符设置为空白,防止再次遍历
board[i][j] = '\0';
boolean res = dfs(board, cs, i + 1, j, curIndex + 1) ||
dfs(board, cs, i - 1, j, curIndex + 1) ||
dfs(board, cs, i, j + 1, curIndex + 1) ||
dfs(board, cs, i, j - 1, curIndex + 1);
// 回溯的时候要把原来设置为空白字符的还原
board[i][j] = cs[curIndex];
// 只要出现true,就一路返回
return res;
}
}
复杂度分析
- 时间复杂度:\(O(MN·3^K)\),二维数组共有M·N个起点;然后对于每个起点来说,每步都有三个方向可以选择(不包括上一个方向),最长要走的步数就是
word的长度K,因此复杂度为\(3^K\) - 空间复杂度:\(O(K)\),递归深度最深也就是
word的长度
力扣 - 剑指 Offer 12. 矩阵中的路径的更多相关文章
- 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题
剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ...
- 剑指 Offer 12. 矩阵中的路径
题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...
- 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...
- 力扣 - 剑指 Offer 22. 链表中倒数第k个节点
题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- Go语言实现:【剑指offer】矩阵中的路径
该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- [剑指Offer] 65.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...
随机推荐
- (目录)Fortran学习笔记:开坑!!!
前言:因为某些原因,需要使用Fortran编写程序,记录下Fortran语法学习过程中的部分笔记.在此开坑记录,立下Flag,"希望年末能够更新完" Fortran 学习笔记 陈橙 ...
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- 微信小程序内判断是否关注公众号(JAVA)
微信小程序内判断是否关注公众号(JAVA) 思路来源(第二种): https://blog.csdn.net/Yanheeee/article/details/117295643 /** * 总体思路 ...
- css3新增属性-background背景
css3新增属性 边框属性 背景属性 文字属性 颜色属性 背景属性 属性 说明 background-image 添加背景图片 background-size 指定背景图像的大小 background ...
- 洛谷4072 SDOI2016征途 (斜率优化+dp)
首先根据题目中给的要求,推一下方差的柿子. \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum \] 所以\(ans ...
- Hive中的4种Join方式
common join 普通join,性能较差,存在Shuffle map join 适用情况:大表join小表时,做不等值join 原理:将小表数据广播到各个节点,存储在内存中,在map阶段直接jo ...
- 《python编程:从入门到实践》课后习题及答案
转载: <Python编程:从入门到实践>课后习题及答案-码农之家 (xz577.com) <Python编程:从入门到实践>课后习题及答案 - 信德维拉 - 博客园 (cnb ...
- spring源码分析(二)- 容器基础
1.基本用法 用过Spring的都知道,bean是Spring中最基础也是最核心的.首先看一个简单的例子. 一个类和一个配置文件 package bean; public class MyBean { ...
- 面试不再慌,终于有人把TCP讲明白了。。。
前言 TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现 ...
- java监控JVM的内存使用情况等
以下的程序监控参数的代码,有些是从网络上获取的,此处进行一个记录是为了以后如果要用到方便记录. 1.引入jar包,为了获取一些cpu的使用率等信息 <dependency> <gro ...