剑指offer-矩阵中的路径

问题描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

此类问题跟走迷宫题目一样,都是使用回溯法解答,经典试题。

这是一个可以用回朔法解决的典型题。

  • 首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。
  • 重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。
  • 由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。
  • 由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。

当矩阵中坐标为(row,col)的格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置

package com.genge.offer;/*** Created by Genge on 2016-07-09.* 矩阵中的路径*/
public class MatrixPath {/*** @param matrix 矩阵字符串* @param rows  矩阵行* @param cols  矩阵列* @param str   字符串路径* @return      存在一条路径返回true,否则false*/public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {boolean flag[] = new boolean[matrix.length];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (helper(matrix, rows, cols, i, j, str, 0, flag))return true;}}return false;}private boolean helper(char[] matrix, int rows, int cols, int i, int j, char[] str, int k, boolean[] flag) {int index = i * cols + j;if (i < 0 || i >= rows || j < 0 || j >= cols || matrix[index] != str[k] || flag[index])return false;if(k == str.length - 1) return true;flag[index] = true;if (helper(matrix, rows, cols, i - 1, j, str, k + 1, flag)|| helper(matrix, rows, cols, i + 1, j, str, k + 1, flag)|| helper(matrix, rows, cols, i, j - 1, str, k + 1, flag)|| helper(matrix, rows, cols, i, j + 1, str, k + 1, flag)) {return true;}flag[index] = false;return false;}
}

开始觉得很难很难,不知道从哪里下手,当看了别人的代码才知道可以如此简洁易懂,看来还是接触少了,每天坚持学习一点吧。。。要不然工作找不到了

剑指offer-矩阵中的路径相关推荐

  1. 剑指offer 矩阵中的路径 @python

    剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...

  2. [剑指Offer]-矩阵中的路径

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

  3. 剑指offer:矩阵中的路径

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

  4. 剑指offer——矩阵中的路径

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

  5. 不支持给定路径的格式_剑指offer_12_矩阵中的路径

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

  6. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

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

  7. 剑指 Offer II 110. 所有路径

    链接: l剑指 Offer II 110. 所有路径 代码:代码没通过 class Solution { public:vector<vector<int>> allPaths ...

  8. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

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

  9. 剑指Offer-矩阵中的路径-Python

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

最新文章

  1. Docker学习(8)——构建镜像(Dockerfile、commit)
  2. 优化内存中DataTable搜索速度,IP区域汇总
  3. python3多进程 pool manager_Python多进程multiprocessing.Pool
  4. CPU中的程序是怎么运行起来的
  5. 分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库
  6. html怎样将单元格的字竖式,数学竖式计算的标准格式是怎样的?需要注意哪些问题?...
  7. 01let和const
  8. android UDP通信
  9. VNC+SSH相关应用
  10. 删除pdf(论文)的行号
  11. Android控件Gallery 3D效果
  12. pythonopencv算法_OpenCV算法精解:基于Python与C++
  13. 高漫数位板驱动下载安装
  14. word中文章页码出现{PAGE}{PAGE \* MERGEFORMAT}的解决办法
  15. 基于C51实现测试人体反应速度
  16. alert转换成html,如何修改alert弹窗的具体样式?
  17. 安卓盒子launcher界面开发之添加自动定位,获取当地天气
  18. 在网页中使用iframe嵌入B站视频(腾讯视频同理)
  19. 3dsMax如何渲染模型
  20. 如何写cover letter 翻译自How to write a cover letter

热门文章

  1. JavaScript经典案例:用户协议确认
  2. Vue中slot的使用(具名插槽与作用域插槽)
  3. Hadoop大数据平台实践(二):Hadoop生态组件的学习文档
  4. 第六章-过程封装(函数)代码实例(C++蓝豹子)
  5. 六级考研单词之路-十二
  6. Python+Selenium实现12306模拟登录
  7. 网站运营长尾关键词怎么挖掘?
  8. SQLServer SubString函数提示[传递给 LEFT 或 SUBSTRING 函数的长度参数无效]错误的解决方法
  9. JavaScript鼠标点击事件
  10. 【点云配准-4PCS(2008)】4-Points Congruent Sets for Robust Pairwise Surface Registration