剑指Offer-65.矩阵中的路径(C++/Java)
题目:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 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)的更多相关文章
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- [剑指Offer] 65.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题
剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ...
- 力扣 - 剑指 Offer 12. 矩阵中的路径
题目 剑指 Offer 12. 矩阵中的路径 思路1(回溯.DFS) 这题可以使用回溯+递归来解决,思路如下: 将二维数组的每一个元素都作为起点进行回溯查找 每次查找的时候,都有四个方向,但是上一个方 ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- Go语言实现:【剑指offer】矩阵中的路径
该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...
- 剑指offer——13矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指 Offer 12. 矩阵中的路径
题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...
- 用 Go 剑指 Offer 12. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...
随机推荐
- LLM开源小工具(基于代码库快速学习/纯shell调用LLM灵活管理系统)
随着AI的各种信息的发展,LLM各种模型不断涌现,作为一名IT人员不得不向前走,不断探索学习发现新知识. 随着学习,也了解到一些对于模型的调用,从而解决一些问题,或者对已有工具或应用的重写.如下是两个 ...
- 力扣612(MySQL)-平面上的最近距离(中等)
题目: 表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合.写一个查询语句找到两点之间的最近距离,保留 2 位小数. 最近距离在点 (-1,-1) 和( ...
- io_uring vs epoll ,谁在网络编程领域更胜一筹?
简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异. 本文作者:王小光,「高性能存储技术SIG」核心成员. 背景 io_ur ...
- Gartner APM 魔力象限技术解读——全量存储? No! 按需存储?YES!
简介: 在云原生时代,充分利用边缘节点的计算和存储能力,结合冷热数据分离实现高性价比的数据价值探索已经逐渐成为 APM 领域的主流. 作者:夏明(涯海) 调用链记录了完整的请求状态及流转信息,是一座巨 ...
- SQL server 查看脚本
原文出处:http://blog.csdn.net/xiaochunyong/article/details/7455051 --Siuon --查看存储过程源码 create procedure m ...
- XYCTF pwn部分题解 (部分题目详解)
hello_world(签到) 思路: 这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shell wp: invisible_flag 思 ...
- Solution Set - LCT
A[洛谷P3690]维护一个森林,支持询问路径xor和,连边(已连通则忽略),删边(无边则忽略),改变点权. B[洛谷P3203]\(n\)个装置编号为\(0,...,n-1\),从\(i\)可以一步 ...
- Deepin安装Python3
https://www.jianshu.com/p/0c61bdfb9589 也可以看这篇,本文是这篇的简捷版,均原创 首先,把系统更到最新,并复制下面的代码 sudo apt update 更新软件 ...
- Ubuntu更新源文件报错:E: 仓库 “http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release” 没有 Release 文件。
E: 仓库 "http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release" 没有 Release 文件. 一条 ...
- web3.js:使用eth包
原文在这里 简介 web3-eth包提供了一套强大的功能,可以与以太坊区块链和智能合约进行交互.在本教程中,我们将指导您如何使用web3.js版本4的web3-eth包的基础知识.我们将在整个示例中使 ...