问题描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的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

代码

使用额外空间:

class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int length = word.size();
int m = board.size(),n = board[0].size();
vector<vector<bool>> flag(m,vector<bool>(n,false));
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
if( check(board,i,j,word,0,flag))
return true;;
}
return false;
}
bool check(vector<vector<char>>& board, int indx,int indy,string word,int ind,vector<vector<bool>> &flag)
{
if(ind == word.size())return true;
int m = board.size(),n = board[0].size();
if(indx < 0 || indx >= m || indy < 0 || indy >= n || board[indx][indy]!=word[ind]||flag[indx][indy])
return false;
flag[indx][indy] = true;
bool res = check(board,indx+1,indy,word,ind+1,flag)||
check(board,indx,indy+1,word,ind+1,flag)||
check(board,indx-1,indy,word,ind+1,flag)||
check(board,indx,indy-1,word,ind+1,flag);
flag[indx][indy] = false;
return res;
}
};

结果:

执行用时 :448 ms, 在所有 C++ 提交中击败了14.88%的用户
内存消耗 :187.6 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

不使用额外空间

class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int length = word.size();
int m = board.size(),n = board[0].size();
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
if( check(board,i,j,word,0))
return true;;
}
return false;
}
bool check(vector<vector<char>>& board, int indx,int indy,string word,int ind)
{
if(ind == word.size())return true;
int m = board.size(),n = board[0].size();
if(indx < 0 || indx >= m || indy < 0 || indy >= n || board[indx][indy]!=word[ind]||board[indx][indy]=='*')
return false;
char c = board[indx][indy];
board[indx][indy]='*';
bool res = check(board,indx+1,indy,word,ind+1)||
check(board,indx,indy+1,word,ind+1)||
check(board,indx-1,indy,word,ind+1)||
check(board,indx,indy-1,word,ind+1);
board[indx][indy] = c;
return res;
}
};

结果:

执行用时 :392 ms, 在所有 C++ 提交中击败了24.83%的用户
内存消耗 :187 MB, 在所有 C++ 提交中击败了100.00%的用户

《剑指offer》面试题12. 矩阵中的路径的更多相关文章

  1. 剑指offer(65)矩阵中的路径

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

  2. 【剑指Offer】65、矩阵中的路径

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

  3. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  4. 【剑指Offer】面试题12. 矩阵中的路径

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

  5. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  6. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  7. 剑指Offer:面试题12——打印1到最大的n位数(java实现)

    问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...

  8. 【剑指offer 面试题12】打印1到最大的n位数

    思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...

  9. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

随机推荐

  1. MES目前应用很多,为什么APS计划排程系统应用很少?

    一.APS自动化计划排程能带来哪些效益? 1.提高订单准时交货率,提高客户满意度 2.缩短生产制造周期,提高生产效率 3.多品种.小批量.以销定产,快速解决插单.急单预测交期问题 4.减少物料采购提前 ...

  2. 每一个each(Power Query 之 M 语言)

    each _ 固定结构,表示每一个(废话,each这单词中文意思就是每一个) 但后面的下划线,是个省略参数的写法-- 首先,each后面不是非要跟_ 其次,_代表的意思是指定列里同行的每一个,这时的公 ...

  3. 如何完成符合ISO 26262要求的基于模型设计(MBD)的测试

    背景介绍 随着汽车行业的迅速发展,汽车的复杂程度不断增加,越来越多的汽车电子控制系统具有与安全相关的功能,因此对ECU的安全要求也越来越高.复杂的软件功能,将会带来大量的软件风险问题,如何保证软件的安 ...

  4. grep 命令过滤配置文件中的注释和空

    grep 用法 Usage: grep [OPTION]... PATTERN [FILE]... Search for PATTERN in each FILE or standard input. ...

  5. zabbix保姆级安装教程

    安装步骤 1.进入官网选择下载的版本和服务器类型 官网地址:https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=cent ...

  6. Add File as a Link on Visual Studio

    https://stackoverflow.com/questions/18963750/add-file-as-a-link-on-visual-studio-debug-vs-publish Ev ...

  7. 使用docker创建含有FFmpeg的自定义镜像

    Dockerfile文件 FROM openjdk:8-jre-alpine MAINTAINER "yvioo" RUN echo "http://mirrors.al ...

  8. JAVAWeb项目实现在线预览、打开office文件

    Web项目实现在线预览浏览word.ppt.excel文档方法 调用以下链接 https://view.officeapps.live.com/op/view.aspx?src=你的文档绝对路径 这里 ...

  9. HDZ城市行深圳站|AIoT时代,如何抓住智联生活的战略机会点?

    摘要:2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落幕. 2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落 ...

  10. Trial-faster-rcnn

    目录 motivation 实验设置 实验结果 motivation 试一下faster rcnn的代码, 主要想看看backbone训练一部分好呢还是全部都训练好呢? 实验设置 Attribute ...