题目:矩阵中的路径

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

解题:

思路:

首先对所整个矩阵遍历,找到第一个字符,然后向上下左右查找下一个字符,由于每个字符都是相同的判断方法(先判断当前字符是否相等,再向四周查找),因此采用递归函数。由于字符查找过后不能重复进入,所以还要定义一个与字符矩阵大小相同的布尔值矩阵,进入过的格子标记为true。如果不满足的情况下,需要进行回溯,此时,要将当前位置的布尔值标记回false。(所谓的回溯无非就是对使用过的字符进行标记和处理后的去标记)

class Solution {
public:bool exist(vector<vector<char>>& board, string word) {for(int i = 0; i < board.size(); i++){for(int j = 0; j < board[i].size(); j++){if(dfs(board, word, 0, i, j)) return true;}}return false;}bool dfs(vector<vector<char> >& board, string& word, int n, int x, int y){if(board[x][y] != word[n]) return false;if(n == word.size()-1) return true;int dx[4]={1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};char t = board[x][y];board[x][y] = '*';for(int i = 0; i < 4; i++){int u = dx[i] + x, v = dy[i] + y;if(u >= 0 && u < board.size() && v >= 0 && v < board[u].size()){if(dfs(board, word, n+1, u, v)) return true;} }board[x][y] = t;return false;}
};

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

剑指offer:面试题12. 矩阵中的路径相关推荐

  1. 剑指Offer - 面试题12. 矩阵中的路径(DFS回溯)

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

  2. 剑指offer面试题12. 矩阵中的路径(矩阵搜索)(深度优先搜索)(剪枝)

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

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

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

  4. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  5. 剑指offer面试题[64]-数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 分 ...

  6. 剑指offer面试题[40]-数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...

  7. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  8. leetcode —— 面试题12. 矩阵中的路径

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

  9. 剑指offer 回溯法 面试题12 矩阵中的路径 面试题13 机器人的运动范围

    题目12 bool has_path_core(char *matrix, int rows, int cols, int row, int col, string a, int &pathl ...

最新文章

  1. 20~40K | 迁移科技招3D视觉、深度学习算法工程师等十大岗位
  2. Spring Cloud Edgware新特性之一:解决Eureka中Jersey 1.x版本过旧的问题-不使用Jersey
  3. Gartner:中国CIO们正将IT预算投向数字化
  4. RTSP再学习 -- Hi3516A RTSP实例
  5. 【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案
  6. 根据个人亲身进阶架构师经历系统构建20大进阶架构师专题!
  7. 数据库——SQL-SERVER练习(4) 建表及数据完整性
  8. Educoder 机器学习 神经网络 第三关:反向传播算法
  9. SRM 574 DIV1 L2
  10. python类方法和实例方法的区别_python中的类方法,实例方法和静态方法的区别
  11. linux 字符驱动 tty,打通linux的tty驱动的数据链路
  12. 线性/非线性规划问题求解
  13. Sparse sharing 在ANN实现多任务时的应用
  14. 开源项目推荐 | 面向智慧城市的计算机视觉算法基准测试 Benchmark for Smart City上线
  15. 对于无人驾驶技术(驾驶自动化)L0-L5分级的说明
  16. 隐马尔可夫模型(一)概念
  17. 使用 C# 将数字转换成大写人民币
  18. 程序员用c语言写的新年祝福,程序员的新年祝福:Happy New Year
  19. python语言网课答案_Python语言基础答案
  20. 爬虫进阶之多线程爬虫

热门文章

  1. Python20-Day05
  2. Solr定时重建索引和增量更新
  3. 两台计算机通过传统电话网络,计算机网络的复习题.doc
  4. nodejs pm2使用
  5. Oracle常用傻瓜问题1000问
  6. 2016 linux发行版排行_Linux发行版排行榜榜首:MX 19.1操作系统自有它不凡的魅力...
  7. 桥接模式和路由模式区别_【微课堂】路由器设置:桥接模式vs路由模式
  8. python目前的应用领域_专栏G|轻松学Python01:Python环境搭建与运行
  9. window linux上传文件命令,windows通过cmd命令行使用sftp上传文件至linux
  10. php将数组最后一个单元弹出,php array_pop()数组函数将数组最后一个单元弹出(出栈)...