【剑指Offer】面试题12. 矩阵中的路径
题目
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的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
 
思路
同 【LeetCode】79. 单词搜索
以每个位置开头检查是否存在路径。
代码
时间复杂度:O(n * m)
空间复杂度:O(1)
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int row = board.size(), col = board[0].size();
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if (board[i][j] == word[0] && dfs(board, i, j, 0, word)) {
                    return true;
                }
            }
        }
        return false;
    }
    bool dfs(vector<vector<char>> &board, int i, int j, int len, string word) {
        int row = board.size(), col = board[0].size();
        if (i < 0 || i >= row || j < 0 || j >= col || word[len] != board[i][j]) return false;
        if (len == word.size() - 1) return true;
        ++len;
        char ch = board[i][j];
        board[i][j] = '#';
        bool ret = dfs(board, i - 1, j, len, word) ||
                   dfs(board, i + 1, j, len, word) ||
                   dfs(board, i, j - 1, len, word) ||
                   dfs(board, i, j + 1, len, word);
        board[i][j] = ch; //回溯
        return ret;
    }
};
另一种写法
使用访问数组表示每个位置是否访问。
时间复杂度:O(n * m)
空间复杂度:O(n * m)
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int row = board.size(), col = board[0].size();
        vector<vector<bool>> visited(row, vector<bool>(col));
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if (board[i][j] == word[0] && dfs(board, i, j, 0, word, visited)) {
                    return true;
                }
            }
        }
        return false;
    }
    bool dfs(vector<vector<char>> &board, int i, int j, int len, string word, vector<vector<bool>> &visited) {
        int row = board.size(), col = board[0].size();
        if (i < 0 || i >= row || j < 0 || j >= col || visited[i][j] || word[len] != board[i][j]) return false;
        if (len == word.size() - 1) return true;
        ++len;
        visited[i][j] = true;
        bool ret = dfs(board, i - 1, j, len, word, visited) ||
                   dfs(board, i + 1, j, len, word, visited) ||
                   dfs(board, i, j - 1, len, word, visited) ||
                   dfs(board, i, j + 1, len, word, visited);
        visited[i][j] = false; //回溯
        return ret;
    }
};
												
											【剑指Offer】面试题12. 矩阵中的路径的更多相关文章
- 剑指offer(65)矩阵中的路径
		
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
 - 【剑指Offer】65、矩阵中的路径
		
题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...
 - 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
		
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
 - 《剑指offer》面试题12. 矩阵中的路径
		
问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该 ...
 - 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
		
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...
 - 剑指offer 面试题 删除链表中重复的节点
		
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
 - 剑指Offer:面试题12——打印1到最大的n位数(java实现)
		
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
 - 【剑指offer 面试题12】打印1到最大的n位数
		
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
 - 剑指offer 面试题56. 数组中只出现一次的两个数字
		
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...
 
随机推荐
- 在webView中除去广告
			
首先建一个ADFilterTool.java类 代码如下 import android.content.Context; import android.content.res.Resources; p ...
 - 组态DP主站与标准从站的步骤
			
分为以下几个部分 第一:组态DP主站与标准从站 分为以下几个步骤 步骤1: 将标准从站ET200 ,ET200在硬件组态软件界面的最右边的PROFIBUS-DP界面里面, PROFIBUS-DP里面是 ...
 - js原型链。。fuck
			
function Person(name){ this.name = name; }; function Mother(){ }; //给mother提供公有的属性 Mother.prototype ...
 - 同源策略、跨域、json和jsonp
			
同源策略 源(origin)就是协议.域名和端口号.若地址里面的协议.域名和端口号均相同则属于同源. 以下是相对于 http://www.a.com/test/index.html 的同源检测 • h ...
 - L1和L2范数理解
			
参考:https://www.jianshu.com/p/4bad38fe07e6
 - 「SCOI2010」连续攻击游戏
			
传送门 Luogu 解题思路 二分图匹配,关键是建图. 如果我们naive地直接把每个武器的两个属性分为两部建图的话,显然是跑不了的. 我们考虑把每一个武器的属性向它连边:\(a_i \rightar ...
 - Git如何合并Commit
			
如果你在 push 你的修改之前想要将本地多次修改后的 commit 合并一下变得更好看,可以使用下面的方法. 指定你要合并的 commit 相关的命令有两种 你可以通过指定修改过去的几个 commi ...
 - 吴裕雄--天生自然JAVA数据库编程:CallableStatement接口
			
DELIMITER // DROP PROCEDURE myproc // -- 删除过程 CREATE PROCEDURE myproc(IN p1 int,INOUT p2 int,OUT p3 ...
 - python操作mongoDB(pymongo的使用)
			
pymongo操作手册 连接数据库 方法一(推荐) import pymongo client = pymongo.MongoClient(host="localhost",por ...
 - day04-Python运维开发基础(位运算、代码块、流程控制)
			
# (7)位运算符: & | ^ << >> ~ var1 = 19 var2 = 15 # & 按位与 res = var1 & var2 " ...