leetcode-79-单词搜索(用dfs解决)
题目描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
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解决)的更多相关文章
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- Leetcode 79.单词搜索
单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- LeetCode——79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
- LeetCode 79.单词搜索 - JavaScript
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- LeetCode 79. 单词搜索(Word Search)
题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- [LeetCode题解]79. 单词搜索
题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ...
- [leetcode] 212. 单词搜索 II(Java)
212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...
- Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)
Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...
随机推荐
- redis的连接方法|连接池|操作
1.先看下redis的连接 import redis # 连接服务端 r = redis.Redis(host="127.0.0.1",port=6379) #获取所有的key值 ...
- js日期格式化 扩展Date()
javascript Date format(js日期格式化) 方法一: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(H/h).分(m).秒(s ...
- Android使用ListView使用方法
Android使用ListView应该注意的地方 在ListView中设置Selector为null会报空指针? mListView.setSelector(null);//空指针 试试下面这种: ...
- 怎样才能做好SNS社区网站
顺应历史潮流,大批的网络社区SNS(Social Networking Services)发展起来. SNS旨在构建一个网络上的人际关系网,让公众足不出户即可实现社交意愿.SNS满足了人的交流欲望,成 ...
- HTML5 本地存储+layer弹层组件制作记事本
什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是 cookie.但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,但是这 ...
- 【转载】Reactor模式,或者叫反应器模式
Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...
- 用OLEDB读取EXCEL时,单元格内容长度超过255被截断
https://support.microsoft.com/zh-cn/help/189897/data-truncated-to-255-characters-with-excel-odbc-dri ...
- IntelliJ IDEA 2017版开发SpringBoot之fastJsonHttpMessageConvert使用
继承WebMvcConfigurerAdapter,改写成自己的json转换工具的写法 1.建立实体类 package com.fastjson; import com.alibaba.fastjso ...
- 整理Javascript基础数据和引用数据复制值的问题
Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型.他们的存储方式是不同的 基础类型的数据存储是保存在栈内存中的: 例如: var a=1; var b=a; var a= ...
- UVa 818Cutting Chains (暴力dfs+位运算+二进制法)
题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...