[算法题解详细]回溯解力扣79单词搜索,资深web前端开发

提示

  1. m == board.length

  2. n = board[i].length

  3. 1 <= m, n <= 6

  4. 1 <= word.length <= 15

  5. board 和 word 仅由大小写英文字母组成

思路


这道题目与我们之前碰到的有些类似,之前我们在做岛屿的那些题目是从某个符合值等于特殊符号开始进入dfs函数,这里则是从值等于word[0]的点开始进入dfs函数,即从一个单词的第一个字符开始搜索。

在dfs函数中,我们可以设置一些剪枝的方法,具体我们在代码中讲,然后在搜索过程中我们要及时回溯,多说无益,接下来进入代码

代码


主函数中是做一个循环遍历这个二维网格,如果找到符合条件的网格进入dfs函数,在循环中如果有满足答案的直接返回true,循环完后也就是遍历完后还没有终止就直接返回false

class Solution {

public:

int m, n;

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

m = board.size();

n = board[0].size();

for(int i = 0; i < m; i++) {

for(int j = 0; j < n; j++) {

if(board[i][j] == word[0]) {

if(dfs(board, word, 0, i, j)) {

return true;

}

}

}

}

return false;

}

};

dfs函数传递的参数为,我们需要搜索的网格board,搜索目标单词word,还有搜索层数u,同时也代表当前搜索到的匹配成功的字符数,初始我们从主函数中传入值为0,然后是x,y代表二维网格中的一个点

在这道题中出口条件我们可以设置两个:

一是当前搜索点值跟当前需要匹配的字值不相等时直接返回false,相当于一种剪枝手段,可以剪去一些不符合规定的情况

二是当搜索层数等于单词长度减一的时候直接返回true

这里可能会有两个疑问

1.搜索层数为什么是等于单词长度减一而不是单词长度?

这是因为我们为了方便利用递归层数u直接作为数组下标使用,所以我们传入的u的初始值为0,我们也可以传入1,

但是这样我们在使用u的时候都需要减一才是我们想要的数组下标

2.为什么这两个值相等就能直接返回true?

这是因为我们在之前的搜索中限制的条件使得如果这个u等于了这个单词长度减一,

那么搜索到的单词一定是与word相等的单词,因为不相等的字符我们都已经在之前给剪掉了

bool dfs(vector<vector>& board, string& word, int u, int x, int y) {

if(board[x][y] != word[u]) {

return false;

}

if(u == word.size() - 1) {

return true;

}

}

这里需要注意一下dfs函数返回值是bool类型,因为这题只需要判断是否能搜索到,而不需要搜索的答案

然后是回溯以及对当前点的上下左右四个方向进行搜索,这里要注意我们仍然需要对搜索过的点进行标记,以防止我们走回头路。

int dx[4] = {1, -1, 0, 0};

int dy[4] = {0, 0, 1, -1};

bool dfs(vector<vector>& board, string& word, int u, int x, int y) {

if(board[x][y] != word[u]) {

return false;

}

if(u == word.size() - 1) {

return true;

}

char str = board[x][y];

board[x][y] = ‘!’;

for(int i = 0; i < 4; i++) {

int a = x + dx[i];

int b = y + dy[i];

if(a < 0 || a >= m || b < 0 || b >= n || board[a][b] == ‘!’) {

continue;

}

if(dfs(board, word, u + 1, a, b)) return true;

}

board[x][y] = str;

return false;

}

这里要注意往上下左右四个方向搜索不再是写四行代码了,那样会比较麻烦,并且会增加消耗的时间。

我们使用dx和dy两个数组,保存x,y往四个方向分别需要加的数值,然后循环四次,依次加上。

这样做我们还能对单独某种情况进行判断,如果加上之后不符合搜索条件,我们可以直接continue从而跳过当前情况,避免进入下一层递归。

下面是整合的完整代码:

class Solution {

public:

int m, n;

int dx[4] = {1, -1, 0, 0};

int dy[4] = {0, 0, 1, -1};

bool dfs(vector<vector>& board, string& word, int u, int x, int y) {

if(board[x][y] != word[u]) {

return false;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

核心竞争力,怎么才能提高呢?

成年人想要改变生活,逆转状态?那就开始学习吧~

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

前端面试题汇总

JavaScript

性能

linux

前端资料汇总

完整版PDF资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了

前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

.cn/img_convert/ed368cc25284edda453a4c6cb49916ef.png)

前端资料汇总

完整版PDF资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了

前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值