问题描述

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

    最近有个需求需要定时清理服务器上所有的缓存.本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了.谁知道 MemoryCache 类以及 IMemoryCache 扩展方法都没有 ...

  2. 针对HttpClient 重写 HttpRequestRetryHandler针对特定异常 增加重试

    调用方法: public static String doGet(String url) { try { RequestConfig defaultRequestConfig = RequestCon ...

  3. java 数据类型:ArrayList;LinkList性能分析

    各种线性表的性能分析. java提供的List就是一个线性表接口,ArrayList和LinkedList是线性表的两种实现.基于数组的线性表和基于链表的线性表. 一般来说,我们无需理会ArrayLi ...

  4. Django ModelForm表单验证

    ModelForm 在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义 应用场景:定制model admin 的时候可以使用.适用于小业 ...

  5. C++ 智能指针(shared_ptr/weak_ptr)原理分析

    其主要的类关系如下所示(省略相关的类模板参数): 图1 从上面的类图可以清楚的看出shared_ptr内部含有一个指向被管理对象(managed object)T的指针以及一个__shared_cou ...

  6. Centos 配置服务器

    Centos 配置服务器 (配置服务器 除了Git Bash Here 还可以安装Xshell 网址:https://xshell.en.softonic.com/   Wincp 网址:https: ...

  7. JS监控浏览器窗口是否活动,最小化操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【LeetCode】437. Path Sum III 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS + DFS BFS + DFS 日期 题目地 ...

  9. 【LeetCode】908. Smallest Range I 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学计算 日期 题目地址:https://leetc ...

  10. 【LeetCode】419. Battleships in a Board 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...