博客
关于我
【 LeetCode】剑指 Offer 12. 矩阵中的路径 (中等) dfs回溯
阅读量:269 次
发布时间:2019-03-01

本文共 1836 字,大约阅读时间需要 6 分钟。

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

代码:

class Solution {   public:    bool vis[220][220]={   0}; //标记是否走过    int dx[4]={   0,0,-1,1},flag=0; //四个方向,flag为1代表找到路径    int dy[4]={   1,-1,0,0};    void dfs(int x,int y,int index,int len1,int len2,vector<vector<char>>& board, string word)    {           if(flag) return; //剪枝        if(index==word.size()) //找完该路径        {               flag=1; //标记            return;        }        for(int i=0;i<4;i++)        {               int newx=x+dx[i]; //下个位置            int newy=y+dy[i];            if(newx>=0 && newx<len1 && newy>=0 && newy<len2 && !vis[newx][newy]) //在边界内 && 没访问过            {                   if(word[index]!=board[newx][newy]) continue; //不匹配,跳过                vis[newx][newy]=1;                dfs(newx,newy,index+1,len1,len2,board,word);                vis[newx][newy]=0; //回溯            }        }    }    bool exist(vector<vector<char>>& board, string word) {           int len1=board.size(),len2=board[0].size();        for(int i=0;i<len1;i++)        {               for(int j=0;j<len2;j++)            {                   if(board[i][j]==word[0])                {                       vis[i][j]=1;                    dfs(i,j,1,len1,len2,board,word);                    vis[i][j]=0;                    if(flag) return 1; //找到路径,返回                }            }        }        return 0; //没找到    }};

转载地址:http://saao.baihongyu.com/

你可能感兴趣的文章
《ybtoj高效进阶》第二部分第二章例题5 子正方形
查看>>
P1381 单词背诵
查看>>
P5854 【模板】笛卡尔树
查看>>
SpringMVC的基础配置之注解驱动
查看>>
在Ubuntu上安装GCC编译器
查看>>
Maven(高级)之聚合
查看>>
快速构建SpringBoot工程
查看>>
Vue中使用v-for不能用index作为key值
查看>>
position: fixed如何相对父元素定位
查看>>
SecureCRT注册机
查看>>
供应商解决了mini-LED的生产问题 新款MBP蓄势待发?
查看>>
new对象实际是在干嘛,懂了后String相关面试题随便推导
查看>>
菜鸟程序员,被无良HR欺骗,因祸得福,竟“意外”拿下美团offer
查看>>
已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有
查看>>
吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛
查看>>
给公司妹子讲了好久,头都大了,一个SQL语句是如何执行的?
查看>>
阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂
查看>>
结局已定,一点不慌,秋招京东三面,给了意料之中的20KOffer。
查看>>
Java开发5年的我偶然被几条朋友圈打击,成功点燃,别说了,不去阿里对不起自己!
查看>>
面试清单(Java岗):算法+Spring+中间件+设计模式+Java+JVM+数据库
查看>>