题目描述:

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
] 给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

要完成的函数:

bool exist(vector<vector<char>>& board, string word)

说明:

1、这道题给定一个二维的vector,里面存放着多个英文字符,还给了一个string,代表一个英文单词。

要求判断二维vector中存不存在一条路径,连起来刚好就是string代表的单词。

这条路径不能使用重复的字符。

如果存在这样一条路径,那么返回true,不存在就返回false。

2、这道题其实也就是深度优先搜索(DFS)的题目,熟悉这个算法的同学做这道题会很快。

我们还是照旧,举个例子,大致说明一下思路。

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定的单词是SEE,那么我们首先在矩阵中找到S,有两个,我们先试第一个,明显第二个字母就对不上了,于是我们进入对第二个的查找。

在第二个周围,我们先试S上方的E,然后再在这个E的周围找另一个E,明显没有。

于是我们退一步,不试S上方的E了,我们尝试S下方的E,可以,再在其附近找另一个E,也找得到。

我们在尝试的时候,要注意这个字符之前有没有使用过,这一步要做点处理。

从上述思路中,我们可以知道要用循环+递归的方法来做这道题。

先用循环找到第一个字符的索引,然后进入递归,如果递归成功找到了,那么返回true。

如果不存在,那么再循环找第一个字符的下一个索引,然后同样进入递归,如果递归成功了,那么返回true。

如果还是没有,那么再循环,一直循环,如果一直不满足,最后返回false。

代码如下(附详解):

    bool dfs(vector<vector<char>>& board,int i,int j,string word,int index)
{
if(index==word.size())return true;//退出条件,满足了说明成功找到
int hang=board.size(),lie=board[0].size();
if(i>0)//尝试上方的字符
{
if(board[i-1][j]==word[index])
{
board[i-1][j]='!';//修改,避免重复使用
if(dfs(board,i-1,j,word,index+1))//再度进入递归
return true;
board[i-1][j]=word[index];//修改回去
}
}
if(i<hang-1)//尝试下方的字符
{
if(board[i+1][j]==word[index])
{
board[i+1][j]='!';
if(dfs(board,i+1,j,word,index+1))
return true;
board[i+1][j]=word[index];
}
}
if(j>0)//尝试左边的字符
{
if(board[i][j-1]==word[index])
{
board[i][j-1]='!';
if(dfs(board,i,j-1,word,index+1))
return true;
board[i][j-1]=word[index];
}
}
if(j<lie-1)//尝试右边的字符
{
if(board[i][j+1]==word[index])
{
board[i][j+1]='!';
if(dfs(board,i,j+1,word,index+1))
return true;
board[i][j+1]=word[index];
}
}
return false;//如果尝试四个方向都没能找到,返回false
}
bool exist(vector<vector<char>>& board, string word)
{
int hang=board.size(),lie=board[0].size();
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
if(board[i][j]==word[0])//找到第一个字符的索引
{
board[i][j]='!';//修改board中这个索引的值,避免重复使用
if(dfs(board,i,j,word,1))//进入递归,如果返回true,那么找得到,最终返回true
return true;
board[i][j]=word[0];//如果递归没成功找到,那么把索引对应的字符给修改回去
}
}
}
return false;//一直没能成功,说明不存在这样一条路径,返回false
}

上述代码实测20ms,beats 94.50% of cpp submissions。

leetcode-79-单词搜索(用dfs解决)的更多相关文章

  1. Java实现 LeetCode 79 单词搜索

    79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...

  2. Leetcode 79.单词搜索

    单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  3. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  4. LeetCode——79. 单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...

  5. LeetCode 79.单词搜索 - JavaScript

    题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  6. LeetCode 79. 单词搜索(Word Search)

    题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...

  7. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  8. [LeetCode题解]79. 单词搜索

    题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ...

  9. [leetcode] 212. 单词搜索 II(Java)

    212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...

  10. Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)

    Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...

随机推荐

  1. ios Https问题

    HTTPS认证过程:   ① 浏览器发送一个连接请求给安全服务器.   ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.   ③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA ...

  2. [Laravel] mac下通过 homestead 搭建环境 到运行项目

    seven_Android 关注 2017.07.03 21:33* 字数 2240 阅读 3464评论 10喜欢 9 之前学习过一段时间的 Laravel ,换 mac 后一直没空做相关的事情,而且 ...

  3. max文件属性设置,

    之前一直都没找到 用到的时候就是用net 弄了.哎.还在开发东西都是在9上面, 这次脚本必须在 max8 上面 逼的我找到了他 getFileAttribute <filename_string ...

  4. view是视图层+action是控制层+service是业务层+dao是数据访问层。

  5. mongodb-win32-i386-3.0.6 使用

    一.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-i386-3.0.6.zip 二.安装 1. systeminfo OS 名称: Micro ...

  6. xib下这种方式创建cell

      这种方法在iOS5.0之前是不能够创建成功的.   MEConvertListTableViewCell *cell = [tableView dequeueReusableCellWithIde ...

  7. 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3

    Web GIS系列: 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 使用GeoServer+QGIS发布WMTS服务 使用GeoSe ...

  8. python ghost.py使用笔记

    ghost.py目前已更新到0.2版本,变化有点大,使用方法上跟0.1还是有点差别的,本文仅以0.1.1版本为例,因为我安装的是这个版本 我用ghost主要用来模拟在网站上的操作,比如登录之类的,当然 ...

  9. php CI框架输出空行问题排查

    今天在使用 curl 命令行工具调试一个功能时,发现输出的内容总是会在最开始莫名其妙的多一行空行: 项目框架是 php 的 CodeIgniter,感觉这种问题在网上不好查找,因为可以确定这个是业务出 ...

  10. SDJZUOJ迷宫问题

    题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行 ...