剑指Offer-矩阵中的路径-Python
矩阵中的路径
题目描述:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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中的换行方式有以下几种:
- 在行末添加转义符:
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."
- 使用圆括号隐式转换:
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相关推荐
- 剑指offer 矩阵中的路径 @python
剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- [剑指Offer]-矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指offer:矩阵中的路径
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某 ...
- 剑指offer——矩阵中的路径
问题描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- 不支持给定路径的格式_剑指offer_12_矩阵中的路径
//面试题12.矩阵中的路径 //题目:请设计一个函数,用来判断在一个矩阵中,是否存在一条包含某字符串所有字符的路径. //路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- 剑指offer-矩阵中的路径
剑指offer-矩阵中的路径 问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个 ...
- 剑指 Offer II 110. 所有路径
链接: l剑指 Offer II 110. 所有路径 代码:代码没通过 class Solution { public:vector<vector<int>> allPaths ...
- 《剑指offer》面试题的Python实现
所属网站分类: 面试经典 > python 作者:gg 链接: http://www.pythonheidong.com/blog/article/464/ 来源:python黑洞网 www.p ...
最新文章
- 新疆大学计算机考研难吗,新疆大学考研难吗?一般要什么水平才可以进入?
- windows下安装nodejs、webpack及打包步骤
- Android之单复选框及Spinner实现二级联动
- nyoj-469--擅长排列的小明 II
- all方法 手写promise_promise.all的实现
- python安卓自动化实现方法_uiautomator +python 实现安卓UI自动化
- (51)蓝湖团队协作开发平台
- 《android 解析WebService》
- Python中终端彩色打印输出
- nsis出错_cf nsis错误怎么办 nsis错误解决办法全解
- android studio设置SVN忽略
- 文秘计算机考核,行政文秘绩效考核
- oracle建索引时报ora00955 名称已由现有对象使用,“ORA-00955: 名称已由现有对象使用” 这个错误是怎么回事?...
- 微信装修装饰小程序源码开发方案
- 惠普微型计算机w7系统,惠普笔记本电脑一键重装系统win7
- 敲简单前端小游戏——贪吃蛇
- vue项目 打包文件大小分析
- 官宣:传智播客品牌全新升级为「传智教育」
- 2016OSC源创会年终盛典-前端技术专场-肖光宇
- android 后退键