矩阵中的路径

题目描述:

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


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

首先,遍历这个矩阵,我们很容易就能找到与字符串str中第一个字符相同的矩阵元素ch。然后遍历ch的上下左右四个字符,如果有和字符串str中下一个字符相同的,就把那个字符当作下一个字符(下一次遍历的起点),如果没有,就需要回退到上一个字符,然后重新遍历。为了避免路径重叠,需要一个辅助矩阵来记录路径情况。

下面代码中,当矩阵坐标为(row,col)的格子和路径字符串中下标为pathLength的字符一样时,从4个相邻的格子(row,col-1)、(row-1,col)、(row,col+1)以及(row+1,col)中去定位路径字符串中下标为pathLength+1的字符。

如果4个相邻的格子都没有匹配字符串中下标为pathLength+1的字符,表明当前路径字符串中下标为pathLength的字符在矩阵中的定位不正确,我们需要回到前一个字符串(pathLength-1),然后重新定位。

一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到格式的位置(此时str[pathLength] == ‘\0’)。
实现:

class Solution:def hasPath(self, matrix, rows, cols, path):# write code hereif not matrix and rows <= 0 and cols <= 0 and path == None:return Falseboolmatrix = [0] * (rows * cols)#boolmatrix = [ [0 for _ in range(cols)] for _ in range(rows)]    #也可以,后面都使用 矩阵boolmatrix[i][j]的形式pathLength = 0for row in range(rows):for col in range(cols):if self.hasPathCore(matrix, rows, cols, row, col, path, pathLength, boolmatrix):return Truereturn Falsedef hasPathCore(self, matrix, rows, cols, row, col, path, pathLength, boolmatrix ):if len(path) == pathLength:return TruehasNextPath = Falseif ( row >= 0 and row < rows and col >= 0 and col < cols and matrix[row*cols + col] == path[pathLength] and not boolmatrix[row*cols + col] ):pathLength += 1boolmatrix[row*cols + col] = True#进行该值的上下左右的递归(周围是否存在下一个路径点)hasNextPath = (self.hasPathCore(matrix, rows, cols, row-1, col, path, pathLength, boolmatrix) or self.hasPathCore(matrix, rows, cols, row, col+1, path, pathLength, boolmatrix) or self.hasPathCore(matrix, rows, cols, row+1, col, path, pathLength, boolmatrix) or self.hasPathCore(matrix, rows, cols, row, col-1, path, pathLength, boolmatrix))#对标记矩阵进行布尔值标记if not hasNextPath:    #说明周围4个点都存在下一路径pathLength -= 1    #回到前一个字符boolmatrix[row*cols + col] = False    #将该点重新设为未标记return hasNextPath

遇到的问题:
虽然python中的换行方式有以下几种:

  1. 在行末添加转义符:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\
Aliquam bibendum purus at nibh rutrum dapibus.\
Aliquam quis sem sagittis, rutrum magna quis, gravida quam.\
Sed porta ex nec leo elementum, a efficitur neque ornare.\
Ut tristique nunc vitae ultrices molestie."
  1. 使用圆括号隐式转换:
s = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit.""Aliquam bibendum purus at nibh rutrum dapibus.""Aliquam quis sem sagittis, rutrum magna quis, gravida quam.""Sed porta ex nec leo elementum, a efficitur neque ornare.""Ut tristique nunc vitae ultrices molestie."

推荐使用第二种。

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. 剑指offer-矩阵中的路径

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

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

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

  9. 《剑指offer》面试题的Python实现

    所属网站分类: 面试经典 > python 作者:gg 链接: http://www.pythonheidong.com/blog/article/464/ 来源:python黑洞网 www.p ...

最新文章

  1. 新疆大学计算机考研难吗,新疆大学考研难吗?一般要什么水平才可以进入?
  2. windows下安装nodejs、webpack及打包步骤
  3. Android之单复选框及Spinner实现二级联动
  4. nyoj-469--擅长排列的小明 II
  5. all方法 手写promise_promise.all的实现
  6. python安卓自动化实现方法_uiautomator +python 实现安卓UI自动化
  7. (51)蓝湖团队协作开发平台
  8. 《android 解析WebService》
  9. Python中终端彩色打印输出
  10. nsis出错_cf nsis错误怎么办 nsis错误解决办法全解
  11. android studio设置SVN忽略
  12. 文秘计算机考核,行政文秘绩效考核
  13. oracle建索引时报ora00955 名称已由现有对象使用,“ORA-00955: 名称已由现有对象使用” 这个错误是怎么回事?...
  14. 微信装修装饰小程序源码开发方案
  15. 惠普微型计算机w7系统,惠普笔记本电脑一键重装系统win7
  16. 敲简单前端小游戏——贪吃蛇
  17. vue项目 打包文件大小分析
  18. 官宣:传智播客品牌全新升级为「传智教育」
  19. 2016OSC源创会年终盛典-前端技术专场-肖光宇
  20. android 后退键

热门文章

  1. 操作系统安全配置操作
  2. 剑指Offer——京东校招笔试题+知识点总结
  3. 替换easyconnect
  4. 一、磁盘数据恢复实验报告
  5. 办公自动化部署策略—— 基于IBM WCS/ WMC实现
  6. thinkphp5 验证码跨域/验证失败 问题解决方案
  7. Adobe Premiere剪辑技巧分享
  8. 在Matlab图片里输入数学公式、符号和希腊字母等
  9. 用友视频教程NC65 NCV6.5财务供应链生产制造实施用友NC视频教程
  10. 2014-1-28 思杨的咒语“胖乎乎真好看”