题目:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

分析:

实际上就是在一个二维矩阵中搜索包含字符串的字符路径,且经过了的格子不能再选择了。

遍历二维数组,当发现字符不相同或者索引超出边界时返回false,如果字符相同的话,就在当前字符的位置开始分别向上下左右继续开始下一个字符的搜索,当字符搜索完毕后,意味着我们找到了这样一条字符路径。注意每一次搜索时标记数组的值要改变。

程序:

C++

class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
for(int i = 0; i < rows; i++){
vector<char> temp;
for(int j = 0; j < cols; ++j){
temp.push_back(*(matrix + i * cols + j));
}
res.push_back(temp);
}
vector<vector<int>> flag(rows, vector<int>(cols, 0));
for(int i = 0; i < rows; ++i){
for(int j = 0; j < cols; ++j){
if(helper(str, i, j, flag)){
return true;
}
}
}
return false;
}
bool helper(char* str, int x, int y, vector<vector<int>> flag){
if(*str == '\0')
return true;
if(x < 0 || x >= res.size() || y < 0 || y >= res[0].size() || res[x][y] != *str || flag[x][y] == 1)
return false;
flag[x][y] = 1;
bool res = helper(str+1, x+1, y, flag)
|| helper(str+1, x-1, y, flag)
|| helper(str+1, x, y+1, flag)
|| helper(str+1, x, y-1, flag);
flag[x][y] = 0;
return res;
}
private:
vector<vector<char>> res;
};

Java

public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
flag = new int[matrix.length];
w = cols;
h = rows;
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if(helper(matrix, i, j, str, 0)){
return true;
}
}
}
return false;
}
public boolean helper(char[] matrix, int x, int y, char[] str, int n){
int index = x * w + y;
if(x < 0 || x > h-1 || y < 0 || y > w-1 || matrix[index] != str[n] || flag[index] == 1)
return false;
if(n == str.length-1)
return true;
flag[index] = 1;
boolean res = helper(matrix, x-1, y, str, n+1)
|| helper(matrix, x+1, y, str, n+1)
|| helper(matrix, x, y+1, str, n+1)
|| helper(matrix, x, y-1, str, n+1);
flag[index] = 0;
return res;
}
private int w;
private int h;
private int[] flag;
}

剑指Offer-65.矩阵中的路径(C++/Java)的更多相关文章

  1. 剑指Offer 65. 矩阵中的路径 (回溯)

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

  2. [剑指Offer] 65.矩阵中的路径

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

  3. 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题

    剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ...

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

    题目 剑指 Offer 12. 矩阵中的路径 思路1(回溯.DFS) 这题可以使用回溯+递归来解决,思路如下: 将二维数组的每一个元素都作为起点进行回溯查找 每次查找的时候,都有四个方向,但是上一个方 ...

  5. 【Java】 剑指offer(11) 矩阵中的路径

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...

  6. Go语言实现:【剑指offer】矩阵中的路径

    该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...

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

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

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

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

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

    题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...

  10. 用 Go 剑指 Offer 12. 矩阵中的路径

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

随机推荐

  1. 顺通鞋服ERP库存管理系统

    鞋服ERP库存管理系统是专门为鞋服行业设计的企业资源规划软件,它提供了一系列库存管理功能,帮助鞋服企业有效管理库存流程和提升库存管理效率.以下是一些鞋服ERP库存管理系统常见的功能和特点: 1. 库存 ...

  2. 测试环境不稳定&复杂的必然性及其对策

    简介: 为什么测试环境的不稳定是必然的,怎么让它尽量稳定一点?为什么测试环境比生产环境更复杂,怎么让它尽量简单一点?本文将就这两点进行分享.同时,还会谈一谈对测试环境和生产环境的区别的理解. 作者 | ...

  3. 阿里云CDN产品经理陈章炜:边缘创新技术和落地实践

    简介: CDN除了加速外,不断被赋予更多价值.在阿里云CDN推出的<极速奔跑吧 2021>首场直播中,阿里云架构师和产品经理不仅对近期阿里云发布的CDN产品最佳实践图进行了详细解读,还对C ...

  4. Java异步非阻塞编程的几种方式

    简介: Java异步非阻塞编程的几种方式 一. 从一个同步的Http调用说起 一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响应的数据. 逆地理接口:通过经纬度获取这个 ...

  5. Dubbo-Admin 正式支持 3.0 服务治理

    ​简介:Dubbo 相信大家并不陌生,是一款微服务开发框架,它提供了 RPC 通信与微服务治理两大关键能力.大家在日常开发中更多使用的是 Dubbo 提供的 RPC 通信这一部分能力,而对其提供的服务 ...

  6. [GPT] 序列模型分类及其模型方案选择

      序列模型可以分为两大类:线性序列模型和非线性序列模型. 线性序列模型:这类模型基于线性关系对时间序列进行建模和预测.常见的线性序列模型包括自回归模型(AR).移动平均模型(MA)和自回归移动平均模 ...

  7. [Gin] gin-jwt 业务逻辑中使用实例化的 middleware 的方式

    依然需要按文档所示实例化一个 authMiddleware. 在路由组中使用的方式是 authMiddleware.MiddlewareFunc(). 通过追踪 MiddlewareFunc 可以知道 ...

  8. 前端关于获取网络时间的方法api

    淘宝 http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp 苏宁http://quan.suning.com/getSys ...

  9. Linux下ffmpeg库的编译链接

    /usr/bin/ld: /usr/local/ffmpeg/lib/libavformat.a(aviobuf.o): in function `ff_crc04C11DB7_update':/ho ...

  10. SpringBoot3.1.5对应新版本SpringCloud开发(1)-Eureka注册中心

    服务的提供者和消费者 服务之间可以通过Spring提供的RestTemplate来进行http请求去请求另一个Springboot的项目,这就叫做服务间的远程调用. 当一个服务通过远程调用去调用另一个 ...