剑指Offer(六十五):矩阵中的路径

2018年2月3日11:01:41 6 10,197 °C
摘要

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

剑指Offer(六十五):矩阵中的路径

一、前言

本系列文章为《剑指Offer》刷题笔记。

刷题平台:牛客网

书籍下载:共享资源

二、题目

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

剑指Offer(六十五):矩阵中的路径

1、思路

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

首先,遍历这个矩阵,我们很容易就能找到与字符串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')。

2、代码

C++:

weinxin
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
Jack Cui

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:6   其中:访客  3   博主  3

    • avatar 裸奔的麻瓜 来自天朝的朋友 谷歌浏览器  LLD-AL10 Build/HONORLLD-AL10 广东省深圳市 电信 3

      请问一下大神,
      1. 14行返回的时候似乎需要释放visited吧
      2. 35行回退时pathLength应该>0才行吧

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Linux 黑龙江省哈尔滨市 联通

          @裸奔的麻瓜 18行释放了。
          这个必然大于0。

            • avatar 裸奔的麻瓜 来自天朝的朋友 谷歌浏览器  LLD-AL10 Build/HONORLLD-AL10 广东省深圳市南山区 电信 3

              @Jack Cui 第14行就退出函数了,不会再跑到18 行吧

          • avatar Lucas 来自天朝的朋友 谷歌浏览器 Mac OS X 10_14_0 江苏省苏州市 电信 2

            请问int& pathLength这里为什么要用引用,不用是否也可以呢

              • avatar Jack Cui Admin 来自天朝的朋友 Safari浏览器 Mac OS X 10_14_3 北京市 百度网讯科技联通节点

                @Lucas 百度看下c++引用的作用,就懂了。